﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using negocios;
using objetos;
using publico;
using System.IO;
using NFe_Util_2G;

namespace nfe
{
    public class NFE  
    {
        // variaveis globais
        public string nfe_DV { get; set; }
        public string nfe_cNF { get; set; }
        public string nfe_msgResultado { get; set; }
        public string nfe_dados { get; set; }
        public string nfe_versao { get; set; }
        public string nfe_chave { get; set; }
        public string nfe_signature { get; set; }
        public string nfe_nroRecibo { get; set; }
        public string nfe_dhRebto { get; set; }
        public string nfe_tMedio { get; set; }
        public string nfe_retWS { get; set; }

        // tags        
        public string nfe_Id { get; set; }
        public string nfe_inf { get; set; }
        public string nfe_ide { get; set; }
        public string nfe_emit { get; set; }
        public string nfe_avulsa { get; set; }
        public string nfe_dest { get; set; }
        public string nfe_retirada { get; set; }
        public string nfe_entrega { get; set; }
        public string nfe_detalhes { get; set; }
        public string nfe_cana { get; set; }
        public string nfe_compra { get; set; }
        
        // notas referenciadas
        public string nfe_NFref { get; set; }
        public string nfe_refNFe { get; set; }
        public string nfe_refNF { get; set; }
        public string nfe_refNFP { get; set; }
        public string nfe_refCTe { get; set; }
        public string nfe_refECF { get; set; }
        
        // total
        public string nfe_total { get; set; }
        public string nfe_ICMSTotal { get; set; }
        public string nfe_ISSQNTotal { get; set; }
        public string nfe_retTrib { get; set; }
        // transportadora
        public string nfe_transp { get; set; }
        public string nfe_transporta { get; set; }
        public string nfe_veicTransp { get; set; }
        public string nfe_reboque { get; set; }
        public string nfe_retTransp { get; set; }
        public string nfe_balsa { get; set; }
        public string nfe_vagao { get; set; }
        public string nfe_vol { get; set; }
        public string nfe_lacres { get; set; }
        // cobranca
        public string nfe_cobr { get; set; }
        public string nfe_fat { get; set; }
        public string nfe_dup { get; set; }
        // produto        
        public string nfe_prod { get; set; }
        public string nfe_DI { get; set; }
        public string nfe_adi { get; set; }
        public string nfe_veicProd { get; set; }
        public string nfe_med { get; set; }
        public string nfe_arma { get; set; }
        public string nfe_comb { get; set; }
        public string nfe_detEspecifico { get; set; }
        // imposto
        public string nfe_imposto { get; set; }
        public string nfe_ICMS { get; set; }
        public string nfe_IPI { get; set; }
        public string nfe_II { get; set; }
        public string nfe_ISSQN { get; set; }
        public string nfe_PIS { get; set; }
        public string nfe_PISST { get; set; }
        public string nfe_COFINS { get; set; }
        public string nfe_COFINSST { get; set; }

        public string nfe_exporta { get; set; }
        public string cana { get; set; }
        public string forDia { get; set; }
        public string deduc { get; set; }

        // informacoes adicionais

        public string nfe_obsCont { get; set; }
        public string nfe_obsFisco { get; set; }
        public string nfe_procRef { get; set; }

        public string nfe_XML { get; set; }

    

        /// <summary>
        /// Identificador
        /// </summary>
        /// <param name="obj"></param>
        public string Identificador(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            
            string Identificador = string.Empty;
            //informar o código da UF do emitente do Documento Fiscal, utilizar a codificação do IBGE (Ex. SP->35, RS->43, etc.)
            int cUF = 0;
            // 	informar o código numérico que compõe a Chave de Acesso. Número aleatório gerado pelo emitente para cada NF-e para evitar acessos indevidos da NF-e. (tamanho do campo reduzido para 8 dígitos)
            int cNF = 0;
            //informar a natureza da operação de que decorrer a saída ou a entrada, tais como: venda, compra, transferência, devolução, importação, consignação, remessa (para fins de demonstração, de industrialização outra), conforme previsto na alínea 'i', inciso I, art. 19 do CONVÊNIO S/Nº, de 15 de dezembro de 1970.
            string natOpe = string.Empty;
            //informar o indicador da forma de pagamento: 0 - pagamento à vista; 1 - pagamento à prazo; 2 - outros.
            int indPag = 0;
            //  	informar o código do Modelo do Documento Fiscal, código 55 para a NF-e.
            int mod = 0;
            //  	informar a série do Documento Fiscal, informar 0 (zero) para série única. A emissão normal pode utilizar série de 0-889, a emissão em contingência SCAN deve utilizar série 900-999.
            int serie = 0;
            // digito verificador;
            int dVer = 0;
            //informar o Número do Documento Fiscal.            
            int nNF = 0;
            // 	informar a data de saída ou entrada da mercadoria ou do produto, pode ser omitido informando: : DateTime.MinValue
            DateTime dEmi = new DateTime();
            //  	informar a hora de saída ou entrada da mercadoria ou do produto no formato HH:MM:SS, pode ser omitido.
            DateTime dSaiEnt = new DateTime();
            // informar a hora de saída ou entrada da mercadoria ou do produto no formato HH:MM:SS, pode ser omitido. (campo novo)
            string hSaiEnt = string.Empty;
            // informar o código do tipo do Documento Fiscal: 0 - entrada ou 1 - saída
            int tpNFe = 0;
            //informar o código do Município de Ocorrência do Fato Gerador do ICMS, que é o local onde ocorre a entrada ou saída da mercacoria, utilizar a Tabela do IBGE
            string cMunFG = string.Empty;
            // informar o grupo de informações NFRef dos documentos fiscais referenciados, Utilizar para referenciar um Documento Fiscal vinculado a NF-e atual. Esta informação será utilizada nas hipóteses previstas na legislação. (Ex.: Devolução de Mercadorias, Substituição de NF cancelada, Complementação de NF, etc.). Necessário montar o grupo XML do documento correspondente. (novas opções de documento referenciado: CT-e, Cupom Fiscal e Nota Fiscal de Produtor)
            string NFRef = string.Empty;
            // informar o formato de impressão do DANFE: 1-retrato ou 2-paisagem.
            int tpImp = 0;
            // informar o código da forma de emissão: 
            // 1 - Normal - emissão normal;
            // 2 - Contingência FS - emissão em contingência com impressão do DANFE em Formulário de Segurança;
            // 3 - Contingência SCAN - emissão em contingência no Sistema de Contingência do Ambiente Nacional - SCAN;
            // 4 - Contingência DPEC - emissão em contingência com envio da Declaração Prévia de Emissão em Contingência - DPEC;
            // 5 - Contingência FS-DA - emissão em contingência com impressão do DANFE em Formulário de Segurança para Impressão de Documento Auxiliar de Documento Fiscal Eletrônico (FS-DA).
            int tpEmis = 0;
            // informar o código do dígito verificador - DV da Chave de Acesso da NF-e, o DV será calculado com a aplicação do algoritmo módulo 11 (base 2,9) da Chave de Acesso.
            // informar o código de identificação do Ambiente: 1-Produção ou 2-Homologação
            int tpAmb = 0;
            // 	informar o código da finalidade de emissão da NF-e: 1- NF-e normal; 2-NF-e complementar; 3 - NF-e de ajuste.
            int finNFe = 0;
            //informar o código de identificação do processo de emissão da NF-e: Identificador do processo de emissão da NF-e:
            //    0 - emissão de NF-e com aplicativo do contribuinte;
            //    1 - emissão de NF-e avulsa pelo Fisco;
            // 2 - emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco;
            // 3- emissão NF-e pelo contribuinte com aplicativo fornecido pelo Fisco.
            int procEmi = 0;
            // informar a versão do processo de emissão da NF-e utilizada (aplicativo emissor de NF-e).
            string verProc = string.Empty;

            //   informar a data e hora de entrada em contingência no formato AAAA-MM-DDTHH:MM:SS (campo novo)
            // Deve ser informado com um conteúdo válido sempre que tpEmis for diferente de 1, para omitir o conteúdo, quando tpEmis=1, informe:
            DateTime dhCont = new DateTime();
            //informar a justificativa de entrada em contingência, deve ser informado sempre que tpEmis for diferente de 1. (campo novo)
            // Importante: dhCont e xJust devem ser ambos informados ou omitidos.
            string xJust = string.Empty;

            // empresa
            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
            
            // endereco empresa
            OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();
            BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();

            // cfop
            OBJ_TB_CFOP o_tb_cfop = new OBJ_TB_CFOP();
            BLL_TB_CFOP b_tb_cfop = new BLL_TB_CFOP();

            // cidade empresa
            OBJ_TB_CIDADE o_tb_cidade_empresa = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade_empresa = new BLL_TB_CIDADE();

            // nf parametro
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();


            try
            {
            
                // empresa
                o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);

                // endereco empresa
                o_tb_endereco_empresa = b_tb_endereco_empresa.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                // cidade 
                o_tb_cidade_empresa = b_tb_cidade_empresa.SelecionarObjetoPorId(o_tb_endereco_empresa.id_cidade);

                // parametro 
                o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                // cfop
                o_tb_cfop = b_tb_cfop.SelecionarObjetoPorId(obj.cfop);

                cUF = o_tb_endereco_empresa.id_uf;
                cNF = obj.num_nota_fiscal;
                natOpe = o_tb_cfop.descricao.ToString();
                indPag = obj.id_forma_pagamento;
                mod = Convert.ToInt32(obj.id_mod_doc_fiscal);
                serie = obj.serie;
                nNF = obj.num_nota_fiscal;
                dEmi = Convert.ToDateTime(obj.dt_emissao);
                dVer = Convert.ToInt32(nfe_DV);
                if (obj.dt_entrada_saida != null)
                {
                    dSaiEnt = Convert.ToDateTime(obj.dt_entrada_saida);
                }
                else
                {
                    dSaiEnt = DateTime.MinValue;
                }
                hSaiEnt = string.Empty;// DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second;
                tpNFe = obj.id_operacao;
                cMunFG = o_tb_cidade_empresa.codigo_ibge.ToString();
                NFRef = nfe_NFref;
                tpImp = o_tb_nf_parametro.id_forma_impressao;
                tpEmis = obj.id_tipo_emissao;
                tpAmb = o_tb_nf_parametro.id_tipo_ambiente;
                finNFe = obj.id_finalidade;
                procEmi = o_tb_nf_parametro.id_processo_emissao;
                verProc = "NFe_Util_2G";
                dhCont = Convert.ToDateTime(obj.dt_contingencia);
                xJust = obj.desc_justificativa;

                Identificador = util.identificador2G(cUF, cNF, natOpe, indPag, mod, serie, nNF, dEmi, dSaiEnt, hSaiEnt, tpNFe, cMunFG, NFRef, tpImp, tpEmis, dVer, tpAmb, finNFe, procEmi, verProc, dhCont, xJust);

                return Identificador;
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo do Emitente da NF-e da versão 2.00 do Leiaute
        /// </summary>
        /// <param name="obj"></param>
        public string Emitente2G(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();

            string Emitente = string.Empty;
            string CNPJ = string.Empty;
            string CPF = string.Empty;
            string xNome = string.Empty;
            string xFant = string.Empty;
            string xLgr = string.Empty;
            string nro = string.Empty;
            string xCpl = string.Empty;
            string xBairro = string.Empty;
            string cMun = string.Empty;
            string xMun = string.Empty;
            string UF = string.Empty;
            string CEP = string.Empty;
            string cPais = string.Empty;
            string xPais = string.Empty;
            string fone = string.Empty;
            string IE = string.Empty;
            string IEST = string.Empty;
            string IM = string.Empty;
            string CNAE = string.Empty;
            string CRT = string.Empty;


            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

     

            OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();
            BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();

            OBJ_TB_CIDADE o_tb_cidade_empresa = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade_empresa = new BLL_TB_CIDADE();

            BLL_TB_PAISES b_tb_paises = new BLL_TB_PAISES();
            OBJ_TB_PAISES o_tb_paises = new OBJ_TB_PAISES();

            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();


            try
            {            
                // empresa
                o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);

      
                // endereco empresa
                o_tb_endereco_empresa = b_tb_endereco_empresa.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                // pais
                o_tb_paises = b_tb_paises.SelecionarObjetoPorId(o_tb_endereco_empresa.id_pais);

                // cidade 
                o_tb_cidade_empresa = b_tb_cidade_empresa.SelecionarObjetoPorId(o_tb_endereco_empresa.id_cidade);

                // uf
                o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_endereco_empresa.id_uf);

                CNPJ = o_tb_empresa.cnpj.ToString();
                CPF = string.Empty;
                xNome = o_tb_empresa.nome.ToString();
                xFant = o_tb_empresa.fantasia.ToString();
                xLgr = o_tb_endereco_empresa.endereco.ToString();
                nro = o_tb_endereco_empresa.numero.ToString();
                xCpl = o_tb_endereco_empresa.complemento.ToString();
                xBairro = o_tb_endereco_empresa.bairro.ToString();
                cMun = o_tb_cidade_empresa.codigo_ibge.ToString();
                xMun = o_tb_cidade_empresa.cidade.ToString();
                UF = o_tb_uf.uf.ToString();
                CEP = o_tb_endereco_empresa.cep.Replace("-","").ToString();
                cPais = o_tb_paises.codigo_ibge.ToString();
                xPais = o_tb_paises.descricao.ToString();
                fone = o_tb_endereco_empresa.telefone.Replace("-","").Replace("(","").Replace(")","").ToString();
                IE = o_tb_empresa.insc_est.Replace(".","").Replace("-","").ToString();
                IEST = o_tb_empresa.insc_est_st.Replace(".", "").Replace("-", "").ToString();
               //  IM = o_tb_empresa.insc_est_st.Replace(".", "").Replace("-", "").ToString();
               // CNAE = o_tb_empresa.id_cnae_primario.ToString();
                CRT = o_tb_empresa.id_crt.ToString();

                Emitente = util.emitente2G(CNPJ, CPF, xNome, xFant, xLgr, nro, xCpl, xBairro, cMun, xMun, UF, CEP, cPais, xPais, fone, IE, IEST, IM, CNAE, CRT);

                return Emitente;
            }
            catch (Exception)
            {

                throw;
            }


        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo do Destinatário da NF-e da versão 2.00 do Leiaute
        /// </summary>
        /// <param name="obj"></param>
        public string Destinatario2G(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            string Destinatario = string.Empty;
            //  	informar o CNPJ do destinatário, sem formatação ou máscara
            string CNPJ = string.Empty;
            // CPF do destinatário, sem formatação ou máscara
            string CPF = string.Empty;
            //informar a razão social do destinatário
            string xNome = string.Empty;
            //informar o logradouro do destinatário
            string xLgr = string.Empty;
            //informar o número do endereço do destinatário, campo obrigatório. Informar S/N ou . (ponto) ou - (traço) para evitar falha de schema XML quando não houver número.
            string nro = string.Empty;
            //  	informar o complemento do endereço do destinatário, pode ser omitido
            string xCpl = string.Empty;
            //informar o bairro do endereço do destinatário
            string xBairro = string.Empty;
            // informar o código do município na codificação do IBGE com 7 dígitos
            string cMun = string.Empty;
            // informar o nome do município
            string xMun = string.Empty;
            //informar a sigla da UF
            string UF = string.Empty;
            // informar o CEP, sem formatação ou máscara, pode ser omitido
            string CEP = string.Empty;
            // informar o código do pais na codificação do BCB, se informado deve ser 1058
            string cPais = string.Empty;
            // informar o nome do país, se informado deve ser Brasil ou BRASIL
            string xPais = string.Empty;
            // informar o telefone com DDD + número, sem formatação (tamanho do campo aumentado)
            string fone = string.Empty;
            // informar a IE do destinatário, sem formatação ou máscara
            string IE = string.Empty;
            // informar a Inscrição SUFRAMA do destinatário, sem formatação ou máscara, se existir.
            string IESUF = string.Empty;
            //informar o e-mail do destinatário, pode ser omitido (campo novo)
            string eMail = string.Empty;

            // cadastro
            OBJ_TB_CADASTRO o_tb_cadastro = new OBJ_TB_CADASTRO();
            BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();

            BLL_TB_ENDERECO_CADASTRO b_tb_endereco_cadastro = new BLL_TB_ENDERECO_CADASTRO();
            OBJ_TB_ENDERECO_CADASTRO o_tb_endereco_cadastro = new OBJ_TB_ENDERECO_CADASTRO();

            // cadastro juridica
            OBJ_TB_CADASTRO_JURIDICA o_tb_cadastro_juridica = new OBJ_TB_CADASTRO_JURIDICA();
            BLL_TB_CADASTRO_JURIDICA b_tb_cadastro_juridica = new BLL_TB_CADASTRO_JURIDICA();

            BLL_TB_CADASTRO_EMAIL b_tb_cadastro_email = new BLL_TB_CADASTRO_EMAIL();

            // cadastro fisica
            OBJ_TB_CADASTRO_FISICA o_tb_cadastro_fisica = new OBJ_TB_CADASTRO_FISICA();
            BLL_TB_CADASTRO_FISICA b_tb_cadastro_fisica = new BLL_TB_CADASTRO_FISICA();

            // endereco cadastro
            OBJ_TB_ENDERECO_CADASTRO o_tb_endereco_empresa = new OBJ_TB_ENDERECO_CADASTRO();
            BLL_TB_ENDERECO_CADASTRO b_tb_endereco_empresa = new BLL_TB_ENDERECO_CADASTRO();

            // cfop
            OBJ_TB_CFOP o_tb_cfop = new OBJ_TB_CFOP();
            BLL_TB_CFOP b_tb_cfop = new BLL_TB_CFOP();

            // paises
            BLL_TB_PAISES b_tb_paises = new BLL_TB_PAISES();
            OBJ_TB_PAISES o_tb_paises = new OBJ_TB_PAISES();

            // cidade
            OBJ_TB_CIDADE o_tb_cidade_empresa = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade_empresa = new BLL_TB_CIDADE();

            // cidade
            OBJ_TB_CIDADE o_tb_cidade_cadastro = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade_cadastro = new BLL_TB_CIDADE();

            // uf
            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();


            // nf parametro
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();


            try
            {
                
                // cadastro
                o_tb_cadastro = b_tb_cadastro.SelecionarObjetoPorId(obj.id_cadastro);

                if (Equals(o_tb_cadastro.pessoa, "J"))
                {
                    o_tb_cadastro_juridica = b_tb_cadastro_juridica.SelecionarObjetoPorId(obj.id_cadastro);
                }
                else
                {
                    o_tb_cadastro_fisica = b_tb_cadastro_fisica.SelecionarObjetoPorId(obj.id_cadastro);
                }

                foreach (OBJ_TB_CADASTRO_EMAIL o_tb_email in b_tb_cadastro_email.SelecionarLista(string.Format("tb_cadastro_email.id_cadastro ={0}", obj.id_cadastro), ""))
                {
                    if (o_tb_email.id_tipo_email == (int)PUB_ENUM.TIPO_CADASTRO_EMAIL.NFE)
                    {
                        eMail = o_tb_email.email.ToString();
                    }
                    else
                    {
                        eMail = o_tb_email.email.ToString();
                    }

                }

                // endereco cadastro
                o_tb_endereco_cadastro = b_tb_endereco_cadastro.SelecionarObjetoPorIdCadastro(obj.id_cadastro);

                // pais
                o_tb_paises = b_tb_paises.SelecionarObjetoPorId(o_tb_endereco_cadastro.id_pais);

                // cidade 
                o_tb_cidade_cadastro = b_tb_cidade_empresa.SelecionarObjetoPorId(o_tb_endereco_cadastro.id_cidade);

                // uf
                o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_endereco_cadastro.id_uf);

                if (o_tb_cadastro.cnpj_cpf.Length == 14)
                {
                    CNPJ = o_tb_cadastro.cnpj_cpf.ToString();
                }
                else
                {
                    CPF = o_tb_cadastro.cnpj_cpf.ToString();
                }

                xNome = o_tb_cadastro.nome.ToString();
                xLgr = o_tb_endereco_cadastro.endereco.ToString();
                nro = o_tb_endereco_cadastro.numero.ToString();
                xCpl = o_tb_endereco_cadastro.complemento.ToString();
                xBairro = o_tb_endereco_cadastro.bairro.ToString();
                cMun = o_tb_cidade_cadastro.codigo_ibge.ToString();
                xMun = o_tb_cidade_cadastro.cidade.ToString();
                UF = o_tb_uf.uf.ToString();
                CEP = o_tb_endereco_cadastro.cep.Replace("-","").ToString();
                cPais = o_tb_paises.codigo_ibge.ToString();
                xPais = o_tb_paises.descricao.ToString();
                fone = o_tb_endereco_cadastro.telefone.Replace("-","").Replace("(","").Replace(")","").ToString();
                IE = o_tb_cadastro_juridica.insc_est.ToString();
                IESUF = string.Empty;

                Destinatario = util.destinatario2G(CNPJ, CPF, xNome, xLgr, nro, xCpl, xBairro, cMun, xMun, UF, CEP, cPais, xPais, fone, IE, IESUF, eMail);

                return Destinatario;

            }
            catch (Exception)
            {
                
                throw;
            }

            
        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo de informações do local de retirada
        /// </summary>
        /// <param name="obj"></param>
        public string LocalRetirada2G(OBJ_TB_NF obj)
        {


            NFe_Util_2G.Util util = new Util();

            string LocalRetirada = string.Empty;
            string CNPJ = string.Empty;
            string CPF = string.Empty;
            string xLgr = string.Empty;
            string nro = string.Empty;
            string xCpl = string.Empty;
            string xBairro = string.Empty;
            string cMun = string.Empty;
            string xMun = string.Empty;
            string UF = string.Empty;

            // empresa
            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            // endereco empresa 
            BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();
            OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();

            // cidade
            OBJ_TB_CIDADE o_tb_cidade = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade = new BLL_TB_CIDADE();
            
            // uf
            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();



            try
            {

                // empresa
                o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);

                // endereco empresa
                o_tb_endereco_empresa = b_tb_endereco_empresa.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                // cidade
                o_tb_cidade = b_tb_cidade.SelecionarObjetoPorId(o_tb_endereco_empresa.id_cidade);

                // uf
                o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_cidade.id_uf);

                CNPJ = o_tb_empresa.cnpj.ToString();
                xLgr = o_tb_endereco_empresa.endereco.ToString();
                nro = o_tb_endereco_empresa.numero.ToString();
                xCpl = o_tb_endereco_empresa.complemento.ToString();
                xBairro = o_tb_endereco_empresa.bairro.ToString();
                cMun = o_tb_cidade.codigo_ibge.ToString();
                xMun = o_tb_cidade.cidade.ToString();
                UF = o_tb_uf.uf.ToString();

                LocalRetirada = util.localRetirada2G(CNPJ, CPF, xLgr, nro, xCpl, xBairro, cMun, xMun, UF);

                return LocalRetirada;
            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo do item de detalhamento da NF-e
        /// Este grupo de informação é de informação obrigatória, a NF-e deve ter pelo menos um item de produto por exigência do Schema XML
        /// Se houver mais de um item de detalhe, o usuário deve concatenar os detalhes.
        /// </summary>
        /// <param name="nItem"></param>
        /// <param name="produto"></param>
        /// <param name="imposto"></param>
        /// <param name="infAdProd"></param>
        /// <returns></returns>
        public string Detalhe(int nItem, string nfe_produto, string nfe_imposto, string nfe_infAdProd)
        {
            NFe_Util_2G.Util util = new Util();
            try
            {

                return util.detalhe(nItem, nfe_produto, nfe_imposto, nfe_infAdProd);
            }
            catch (Exception)
            {
                
                throw;
            }
           
           
        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo de informações do local de entrega
        /// </summary>
        /// <param name="obj"></param>
        public string LocalEntrega2G(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();

            string LocalEntrega = string.Empty;
            string CNPJ = string.Empty;
            string CPF = string.Empty;
            string xLgr = string.Empty;
            string nro = string.Empty;
            string xCpl = string.Empty;
            string xBairro = string.Empty;
            string cMun = string.Empty;
            string xMun = string.Empty;
            string UF = string.Empty;

            OBJ_TB_CADASTRO o_tb_cadastro = new OBJ_TB_CADASTRO();
            BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();

            BLL_TB_ENDERECO_CADASTRO b_tb_endereco_cadastro = new BLL_TB_ENDERECO_CADASTRO();
            OBJ_TB_ENDERECO_CADASTRO o_tb_endereco_cadastro = new OBJ_TB_ENDERECO_CADASTRO();

            OBJ_TB_CIDADE o_tb_cidade = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade = new BLL_TB_CIDADE();

            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();

            try
            {                
                // cadastro
                o_tb_cadastro = b_tb_cadastro.SelecionarObjetoPorId(obj.id_cadastro);

                // endereco cadastro
                o_tb_endereco_cadastro = b_tb_endereco_cadastro.SelecionarObjetoPorIdCadastro(obj.id_cadastro);

                // cidade
                o_tb_cidade = b_tb_cidade.SelecionarObjetoPorId(o_tb_endereco_cadastro.id_cidade);

                // uf
                o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_cidade.id_uf);

                CNPJ = o_tb_cadastro.cnpj_cpf.ToString();
                xLgr = o_tb_endereco_cadastro.endereco.ToString();
                nro = o_tb_endereco_cadastro.numero.ToString();
                xCpl = o_tb_endereco_cadastro.complemento.ToString();
                xBairro = o_tb_endereco_cadastro.bairro.ToString();
                cMun = o_tb_cidade.codigo_ibge.ToString();
                xMun = o_tb_cidade.cidade.ToString();
                UF = o_tb_uf.uf.ToString();


                LocalEntrega = util.localEntrega2G(CNPJ, CPF, xLgr, nro, xCpl, xBairro, cMun, xMun, UF);
                return LocalEntrega;

            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo do detalhamento de produtos e Serviços da NF-e
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string Produto(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_ITEM b_tb_nf_item = new BLL_TB_NF_ITEM();

            string sProduto = string.Empty;
            string	cProd = string.Empty;
            string	cEAN  = string.Empty;
            string	xProd = string.Empty;
            string	NCM = string.Empty;
            string	EXTIPI = string.Empty;
            int 	CFOP = 0;
            string	uCOM = string.Empty;
            string	qCOM = string.Empty;
            string	vUnCOM = string.Empty;
            double	vProd = 0;
            string	cEANTrib = string.Empty;
            string	uTrib = string.Empty;
            string	qTrib = string.Empty;
            string	vUnTrib = string.Empty;
            double	vFrete = 0;
            double vSeg = 0;
            double vDesc = 0;
            double vOutro = 0;
            int	indTot = 0;
            string	DI =  string.Empty;
            string	DetEspecifico = string.Empty;
            string	xPed = string.Empty;
            int	nItemPed = 0;
            
            try 
	        {	                        
              

             
            
                    cProd = o_tb_nf_item.id.ToString();
                    cEAN = o_tb_nf_item.ean.ToString();
                    xProd = o_tb_nf_item.descricao.ToString();
                    NCM = o_tb_nf_item.id_ncm.ToString();
                    EXTIPI = o_tb_nf_item.extipi.ToString();
                    CFOP = Convert.ToInt32(o_tb_nf_item.cfop.ToString());
                    uCOM = o_tb_nf_item.desc_unid_medida.ToString();
                    qCOM = o_tb_nf_item.qtd.ToString();
                    vUnCOM = o_tb_nf_item.valor_unitario.ToString();
                    vProd = Convert.ToDouble(o_tb_nf_item.valor_total.ToString());
                    cEANTrib = o_tb_nf_item.ean.ToString();
                    uTrib = o_tb_nf_item.desc_unid_medida_trib.ToString();
                    qTrib = o_tb_nf_item.qtd_trib.ToString();
                    vUnTrib = o_tb_nf_item.valor_unitario_trib.ToString();
                    vFrete = Convert.ToDouble(o_tb_nf_item.valor_frete);
                    vSeg = Convert.ToDouble(o_tb_nf_item.valor_seguro);
                    vDesc = Convert.ToDouble(o_tb_nf_item.valor_desconto);
                    vOutro = Convert.ToDouble(o_tb_nf_item.valor_outro);
                    indTot = o_tb_nf_item.ind_total_nota;
                    DI = nfe_DI;
                    DetEspecifico = nfe_detEspecifico;
                    xPed = string.Empty;
                    nItemPed = 0;
 
                    
                    // XML PRODUTO
                    sProduto = util.produto2G(cProd, cEAN, xProd, NCM, EXTIPI, CFOP, uCOM, qCOM, vUnCOM, vProd, cEANTrib, uTrib, qTrib, vUnTrib, vFrete, vSeg, vDesc, vOutro, indTot, nfe_DI, nfe_detEspecifico, xPed, nItemPed);

                    return sProduto;
                
		    
	        }
	        catch (Exception)
	        {
		
		        throw;
	        }
            



        }

 
        /// <summary>
        /// Criar Chave
        /// </summary>
        /// <param name="obj"></param>
        public int CriarChave(OBJ_TB_NF obj, out string msgResultado, out string cNF, out string cDV, out string chaveNFe)
        {
            try
            {
                NFe_Util_2G.Util util = new Util();
                //informar o conteúdo da tag cUF - código da UF na codificação do IBGE: Ex. 35=SP, 43=RS, etc.
                string cUF = string.Empty;
                //informar o Ano da data de emissão com dois dígitos
                string Ano = string.Empty;
                //informar o Mês da data de emissão com dois dígitos
                string Mes = string.Empty;
                //informar o conteúdo da tag CNPJ - CNPJ do emissor
                string CNPJ = string.Empty;
                // informar o conteúdo da tag modelo - modelo da NF-e (valor fixo: 55)
                string modelo = string.Empty;
                // 	informar o conteúdo da tag serie - série da NF-e, informar zero se série única
                string serie = string.Empty;
                // 	informar o conteúdo da tag nNF - número da NF-e
                string numero = string.Empty;
                // 	informar o conteúdo da tag tpemis - forma de emissão da NF-e: 1- Normal, 2-Contingência FS, 3-Contingência SCAN, 4-DPEC e 5-Contigência FS-DA. (campo novo)
                string tpEmis = string.Empty;
                //informar uma literal que será utilizado para gerar o cNF - Código Numérico que compõe a Chave de Acesso, deve ser um literal única para o emissor e dele depende o segredo da formação do cNF, pois é este código que vai individualizar o algoritmo de cálculo que é pública.
                string codigoSeguranca = string.Empty;
                // 	retorna a literal do resultado da chamada do WS
            
                // resulta Mensagem
                int cResultado = 0;

                OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
                BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

                BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();
                OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();
                // empresa
                o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);

                // endereco empresa
                o_tb_endereco_empresa = b_tb_endereco_empresa.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                cUF = o_tb_endereco_empresa.id_uf.ToString();
                Ano = DateTime.Now.Year.ToString().Substring(2, 2);
                Mes = DateTime.Now.Month.ToString();
                CNPJ = o_tb_empresa.cnpj.ToString();
                serie = obj.serie.ToString();
                codigoSeguranca = "softsales";
                modelo = obj.id_mod_doc_fiscal;
                numero = obj.num_nota_fiscal.ToString();
                tpEmis = obj.id_tipo_emissao.ToString();


                cResultado = util.CriaChaveNFe2G(cUF, Ano, Mes, CNPJ, modelo, serie, numero, tpEmis, codigoSeguranca, out msgResultado, out cNF, out cDV, out chaveNFe);

                nfe_cNF = cNF;
                nfe_DV = cDV;
                nfe_chave = chaveNFe;
                nfe_msgResultado = msgResultado;

                return cResultado;
            }
            catch (Exception)
            {
                
                throw;
            }

            
        }


        /// <summary>
        /// Grupo de Impostos do item da NF-e
        /// Funcionalidade para gerar o XML do grupo de tributos do item de detalhamento da NF-e da versão 2.00
        /// </summary>
        /// <param name="nfe_ICMS"></param>
        /// <param name="nfe_IPI"></param>
        /// <param name="nfe_II"></param>
        /// <param name="nfe_PIS"></param>
        /// <param name="nfe_PISST"></param>
        /// <param name="nfe_COFINS"></param>
        /// <param name="nfe_COFINSST"></param>
        /// <param name="nfe_ISSQN"></param>
        /// <returns></returns>
        public string imposto2G( string nfe_ICMS, string nfe_IPI, string nfe_II, string nfe_PIS, string nfe_PISST, string nfe_COFINS, string nfe_COFINSST, string nfe_ISSQN)
        {
            NFe_Util_2G.Util util = new Util();
            return util.imposto2G(nfe_ICMS, nfe_IPI, nfe_II, nfe_PIS, nfe_PISST, nfe_COFINS, nfe_COFINSST, nfe_ISSQN);

        }


        /// <summary>
        /// icms 2g
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string ICMS2G(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();

            BLL_TB_NF b_tb_nf = new BLL_TB_NF();
            OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();      

            BLL_TB_NF_ITEM_IMPOSTO_ICMS b_tb_nf_item_imposto_icms = new BLL_TB_NF_ITEM_IMPOSTO_ICMS();
            string icms = string.Empty;
            // informar o código da origem da mercadoria: 0 - Nacional; 1 - Estrangeira - importação direta; 2 - Estrangeira - adquirida no mercado interno.
            string orig = string.Empty;
            // Tributação do ICMS
            string CST = string.Empty;
            //Modalidade de determinação da BC do ICMS
            int modBC = 0;
            //Percentual da Redução de BC
            double pRedBC = 0;
            // Valor da BC do ICMS
            double vBC = 0;
            // Alíquota do imposto
            double pICMS = 0;
            //  	Valor do ICMS
            double vICMS = 0;
            // Modalidade de determinação da BC do ICMS ST
            int modBCST = 0;
            // Percentual da margem de valor Adicionado do ICMS ST
            double pMVAST = 0;
            // Percentual da Redução de BC do ICMS ST
            double pRedBCST = 0;
            //  	Valor da BC do ICMS ST
            double vBCST = 0;
            //  Alíquota do imposto do ICMS ST
            double pICMSST = 0;
            // 	Valor do ICMS ST
            double vICMSST = 0;
            // 	Valor da BC do ICMS Retido Anteriormente
            double vBCSTRet = 0;
            // Valor do ICMS Retido Anteriormente
            double vICMSSTRet = 0;
            // Valor da BC do ICMS ST da UF destino
            double vBCSTDest = 0;
            // Valor do ICMS ST da UF destino
            double vICMSSTDest = 0;
            // Motivo da desoneração do ICMS
            int motDesICMS = 0;
            // 	Percentual da BC operação própria
            double pBCOp = 0;
            // UF para qual é devido o ICMS ST
            string UFST = string.Empty;
            // 	Alíquota aplicável de cálculo do crédito (Simples Nacional)
            double pCredSN = 0;
            // Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (SIMPLES NACIONAL)
            double vCredICMSSN = 0;

            try
            {
                BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
                OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();

                o_tb_nf = b_tb_nf.SelecionarObjetoPorId(o_tb_nf_item.id_nf);

                o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(o_tb_nf.id_empresa);

                // Funcionalidade para gerar o XML do grupo do ICMS da NF-e 2G
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_ICMS o_tb_nf_item_imposto_icms in b_tb_nf_item_imposto_icms.SelecionarLista(string.Format("tb_nf_item_imposto_icms.id_nf_item={0}", o_tb_nf_item.id), ""))
                {

                    orig = o_tb_nf_item_imposto_icms.id_origem_produto.ToString();

                    if(Equals(o_tb_empresa.id_crt,(int)PUB_ENUM.IMPOSTO_CRT.RegimeNormal))
                    {                        
                        CST = o_tb_nf_item_imposto_icms.id_cst_icms.ToString();
                    }
                    else
                    {
                        CST = o_tb_nf_item_imposto_icms.id_csosn.ToString();   
                    }

                    
                    modBC = o_tb_nf_item_imposto_icms.id_mod_bc_icms;
                    pRedBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_red_bc_icms.ToString()));
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_bc_icms.ToString()));
                    pICMS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_icms.ToString()));
                    vICMS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_icms.ToString()));
                    modBCST = o_tb_nf_item_imposto_icms.id_mod_bc_icms_st;
                    pMVAST = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_icms_mva_st.ToString()));
                    pRedBCST = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_red_bc_icms_st.ToString()));
                    vBCST = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_bc_icms_st.ToString()));
                    pICMSST = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_icms_st.ToString()));
                    vICMSST = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_icms_st.ToString()));
                    vBCSTRet = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_bc_icms_st_ret.ToString()));
                    vICMSSTRet = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_icms_st_ret.ToString()));
                    vBCSTDest = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_bc_icms_st_dest.ToString()));
                    vICMSSTDest = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_icms_st_dest.ToString()));
                    motDesICMS = o_tb_nf_item_imposto_icms.id_mot_desoneracao_icms;
                    pBCOp = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_bc_op_propria.ToString()));
                    UFST = o_tb_nf_item_imposto_icms.uf_st.ToString();
                    pCredSN = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_aliq_cred_sn.ToString()));
                    vCredICMSSN = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_icms.valor_cred_icms_sn.ToString()));

                    icms = util.icms2G(orig, CST, modBC, pRedBC, vBC, pICMS, vICMS, modBCST, pMVAST, pRedBCST, vBCST, pICMSST, vICMSST, vBCSTRet, vICMSSTRet, vBCSTDest, vICMSSTDest, motDesICMS, pBCOp, UFST, pCredSN, vCredICMSSN);

                    break;
                }
              
            

                
                return icms;

            }
            catch (Exception)
            {
                
                throw;
            }
        }
    
        /// <summary>
        /// IPI
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string IPI(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_ITEM_IMPOSTO_IPI b_tb_nf_item_imposto_ipi = new BLL_TB_NF_ITEM_IMPOSTO_IPI();
            string  ipi = string.Empty;
            //  	Informar a classe de enquadramento do IPI para Cigarros e Bebidas conforme Atos Normativos editados pela Receita Federal do Brasil.
            string	clEnq = string.Empty;
            // Informar o CNPJ do produtor da mercadoria, quando diferente do emitente nas exportações direta ou indireta.
            string	CNPJProd = string.Empty;
            // Informar o código do Selo de Controle do IPI conforme Atos Normativos editados pela Receita Federal do Brasil.
            string	cSelo = string.Empty;
            // Informar a quantidade de Selo de Controle do IPI utilizados.
            double	qSelo = 0;
            // **// Informar o Código de Enquadramento Legal do IPI, informar 999 enquanto a tabela não tiver sido criada pela Receita Federal do Brasil.
            string	cEnq = string.Empty;
            // **//	Informar o Código de Situação Tributária do IPI.
            string	CST = string.Empty;
            // Informar o Valor da BC do IPI, este campo deve ser informado em caso de alíquota ad valorem.
            double	vBC = 0;
            // Informar a alíquota percentual do IPI, este campo deve ser informado em caso de alíquota ad valorem.
            double	pIPI = 0;
            // **// Informar o Valor do IPI
            double vIPI = 0;
            //  	Informar a quantidade total na unidade padrão de tributação, este campo deve ser informado em caso de alíquota específica.
            double qUnid = 0;
            // Informar o Valor por Unidade Tributável, este campo deve ser informado em caso de alíquota específica.
            double	vUnid = 0;


            try
            {

           


                // Funcionalidade para gerar o XML do grupo do IPI da NF-e
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_IPI o_tb_nf_item_imposto_ipi in b_tb_nf_item_imposto_ipi.SelecionarLista(string.Format("tb_nf_item_imposto_ipi.id_nf_item={0}", o_tb_nf_item.id), ""))
                {
                    clEnq = o_tb_nf_item_imposto_ipi.classe_enquadramento;
                    CNPJProd = o_tb_nf_item_imposto_ipi.cnpj_produtor;
                    cSelo = o_tb_nf_item_imposto_ipi.codigo_selo_ipi;
                    qSelo = Convert.ToInt32(PUB_FUNCOES.TrataInteiro(o_tb_nf_item_imposto_ipi.qtd_selo_ipi.ToString()));
                    cEnq = o_tb_nf_item_imposto_ipi.codigo_enquadramento_ipi;
                    CST = o_tb_nf_item_imposto_ipi.id_cst_ipi.ToString();
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ipi.valor_bc_ipi.ToString()));
                    pIPI = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ipi.valor_aliq_ipi.ToString()));
                    vIPI = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ipi.valor_ipi.ToString()));
                    qUnid = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ipi.qtd_unid_trib_ipi.ToString()));
                    vUnid = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ipi.valor_unid_trib_ipi.ToString()));
                    ipi = util.IPI(clEnq, CNPJProd, cSelo, qSelo, cEnq, CST, vBC, pIPI, vIPI, qUnid, vUnid);
                    break;
                }
                // Informar o Código de Enquadramento Legal do IPI, informar 999 enquanto a tabela não tiver sido criada pela Receita Federal do Brasil.               
               
                return ipi;

            }
            catch (Exception)
            {
                
                throw;
            }

        }

        /// <summary>
        /// II
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string II(OBJ_TB_NF_ITEM  o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();

            BLL_TB_NF_ITEM_IMPOSTO_II b_tb_nf_item_imposto_ii = new BLL_TB_NF_ITEM_IMPOSTO_II();

            string II = string.Empty;
            // ** //Informar o Valor da BC do Imposto de Importação
            double vBC = 0;
            // ** // Informar o valor das despesas aduaneiras
            double vDespAdu = 0;
            // ** // Informar a o valor do Imposto de Importação
            double vII = 0;
            // ** // 	Informar o Valor do IOF - Imposto sobre Operações Financeiras
            double vIOF = 0;

            try
            {


                // Funcionalidade para gerar o XML do grupo do II - Imposto de Importação da NF-e
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_II o_tb_nf_item_imposto_ii in b_tb_nf_item_imposto_ii.SelecionarLista(string.Format("tb_nf_item_imposto_ii.id_nf_item={0}", o_tb_nf_item.id), ""))
                {
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ii.valor_bc_ii.ToString()));
                    vDespAdu = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ii.valor_desp_adu.ToString()));
                    vII = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ii.valor_ii.ToString()));
                    vIOF = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_ii.valor_iof.ToString()));
                    II = util.II(vBC, vDespAdu, vII, vIOF);
                    break;
                }
             
               

                return II;
            }
            catch (Exception)
            {
                
                throw;
            }
        }
            
        /// <summary>
        /// PIS
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string PIS(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_ITEM_IMPOSTO_PIS b_tb_nf_item_imposto_pis = new BLL_TB_NF_ITEM_IMPOSTO_PIS();
            string pis = string.Empty;
            // ** // 	Informar o Código de Situação Tributária do PIS, para CST=05 informe o grupo PISST PISST.
            // ** //   Cabe ressaltar que a informação do grupo PISST não desobriga a informação do grupo PIS.
            string CST = string.Empty;
            //Informar o Valor da BC do PIS, este campo deve ser informado em caso de alíquota ad valorem.
            double vBC = 0;
            // Informar a alíquota percentual do PIS, este campo deve ser informado em caso de alíquota ad valorem.
            double pPIS = 0;
            // ** // Informar o Valor do PIS
            double vPIS = 0;
            //  	Informar a quantidade vendida, este campo deve ser informado em caso de alíquota específica.
            double qBCProd = 0;
            // Informar a alíquota do PIS em reais, este campo deve ser informado em caso de alíquota específica.
            double vAliqProd = 0;

            try
            {


                // Funcionalidade para gerar o XML do grupo do PIS da NF-e                
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_PIS o_tb_nf_item_imposto_pis in b_tb_nf_item_imposto_pis.SelecionarLista(string.Format("tb_nf_item_imposto_pis.id_nf_item={0}", o_tb_nf_item.id), ""))
                {

                    CST = o_tb_nf_item_imposto_pis.id_cst_pis.ToString();
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis.valor_bc_pis.ToString()));
                    pPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis.valor_aliq_pis.ToString()));
                    vPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis.qtd_bc_prod_pis.ToString()));
                    qBCProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis.qtd_bc_prod_pis.ToString()));
                    vAliqProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis.valor_aliq_prod_pis.ToString()));
                    pis = util.PIS(CST, vBC, pPIS, vPIS, qBCProd, vAliqProd);
                    break;
                }
            
             

                return pis;
            }
            catch (Exception)
            {
                
                throw;
            }

        }

        /// <summary>
        /// PIS ST
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string PISST(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_ITEM_IMPOSTO_PIS_ST b_tb_nf_item_imposto_pis_st = new BLL_TB_NF_ITEM_IMPOSTO_PIS_ST();
            string pisst = string.Empty;
            // Informar o Valor da BC do PIS ST, este campo deve ser informado em caso de alíquota ad valorem.
            double vBC = 0;
            //Informar a alíquota percentual do PIS ST, este campo deve ser informado em caso de alíquota ad valorem.
            double pPIS = 0;
            // ** //Informar o Valor do PIS ST
            double vPIS = 0;
            // Informar a quantidade vendida, este campo deve ser informado em caso de alíquota específica.
            double qBCProd = 0;
            //Informar a alíquota do PIS ST em reais, este campo deve ser informado em caso de alíquota específica.
            double vAliqProd = 0;

            try
            {

                // Funcionalidade para gerar o XML do grupo do PIS da NF-e                
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_PIS_ST o_tb_nf_item_imposto_pis_st in b_tb_nf_item_imposto_pis_st.SelecionarLista(string.Format("tb_nf_item_imposto_pis_st.id_nf_item={0}", o_tb_nf_item.id), ""))
                {

                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis_st.valor_bc_pis_st.ToString()));
                    pPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis_st.valor_aliq_pis_st.ToString()));
                    vPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis_st.valor_pis_st.ToString()));
                    qBCProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis_st.qtd_bc_prod_pis_st.ToString()));
                    vAliqProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_pis_st.valor_aliq_prod_pis_st.ToString()));
                    pisst = util.PISST(vBC, pPIS, vPIS, qBCProd, vAliqProd);
                    break;
                }
                              
               

                return pisst;

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        /// <summary>
        /// COFINS
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string COFINS(OBJ_TB_NF_ITEM  o_tb_nf_item)
        {

            NFe_Util_2G.Util util = new Util();

            BLL_TB_NF_ITEM_IMPOSTO_COFINS b_tb_nf_item_imposto_cofins = new BLL_TB_NF_ITEM_IMPOSTO_COFINS();
            string cofins = string.Empty;
            // ** // Informar o Código de Situação Tributária do COFINS, para CST=05 informe o grupo COFINSST COFINSST.
            // ** //   Cabe ressaltar que a informação do grupo COFINSST não desobriga a informação do grupo COFINS.
            string CST = string.Empty;
            // Informar o Valor da BC do COFINS, este campo deve ser informado em caso de alíquota ad valorem.
            double vBC = 0;
            //Informar a alíquota percentual do COFINS, este campo deve ser informado em caso de alíquota ad valorem.
            double pCOFINS = 0;
            // ** //Informar o Valor do COFINS
            double vCOFINS = 0;
            // Informar a quantidade vendida, este campo deve ser informado em caso de alíquota específica.
            double qBCProd = 0;
            //Informar a alíquota do COFINS em reais, este campo deve ser informado em caso de alíquota específica.
            double vAliqProd = 0;

            try
            {

                // Funcionalidade para gerar o XML do grupo do COFINS da NF-e               
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_COFINS o_tb_nf_item_imposto_cofins in b_tb_nf_item_imposto_cofins.SelecionarLista(string.Format("tb_nf_item_imposto_cofins.id_nf_item={0}", o_tb_nf_item.id), ""))
                {
                    CST = o_tb_nf_item_imposto_cofins.id_cst_cofins.ToString();
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins.valor_bc_cofins.ToString()));
                    pCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins.valor_aliq_cofins.ToString()));
                    vCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins.valor_cofins.ToString()));
                    qBCProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins.qtd_bc_cofins_prod.ToString()));
                    vAliqProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins.valor_aliq_cofins_prod.ToString()));
                    cofins = util.COFINS(CST, vBC, pCOFINS, vCOFINS, qBCProd, vAliqProd);
                    break;
                }

          

              

                return cofins;

            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// COFINS ST
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string COFINSST(OBJ_TB_NF_ITEM  o_tb_nf_item)
        {

            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_ITEM_IMPOSTO_COFINS_ST b_tb_nf_item_imposto_cofins_st = new BLL_TB_NF_ITEM_IMPOSTO_COFINS_ST();
            string cofinsst = string.Empty;         
            // Informar o Valor da BC do COFINS, este campo deve ser informado em caso de alíquota ad valorem.
            double vBC = 0;
            //Informar a alíquota percentual do COFINS, este campo deve ser informado em caso de alíquota ad valorem.
            double pCOFINS = 0;
            // ** //Informar o Valor do COFINS
            double vCOFINS = 0;
            // Informar a quantidade vendida, este campo deve ser informado em caso de alíquota específica.
            double qBCProd = 0;
            //Informar a alíquota do COFINS em reais, este campo deve ser informado em caso de alíquota específica.
            double vAliqProd = 0;

            try
            {

                // Funcionalidade para gerar o XML do grupo do COFINS da NF-e               
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_COFINS_ST o_tb_nf_item_imposto_cofins_st in b_tb_nf_item_imposto_cofins_st.SelecionarLista(string.Format("tb_nf_item_imposto_cofins_st.id_nf_item={0}", o_tb_nf_item.id), ""))
                {
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins_st.valor_bc_cofins_st.ToString()));
                    pCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins_st.valor_aliq_cofins_st.ToString()));
                    vCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins_st.valor_cofins_st.ToString()));
                    qBCProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins_st.qtd_bc_cofins_st_prod.ToString()));
                    vAliqProd = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_cofins_st.valor_aliq_cofins_st_prod.ToString()));
                    cofinsst = util.COFINSST(vBC, pCOFINS, vCOFINS, qBCProd, vAliqProd);
                    break;
                }

             

               

                return cofinsst;

            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// ISSQN
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string ISSQN(OBJ_TB_NF_ITEM o_tb_nf_item)
        {
            NFe_Util_2G.Util util = new Util();

            BLL_TB_NF_ITEM_IMPOSTO_ISSQN b_tb_nf_item_imposto_issqn = new BLL_TB_NF_ITEM_IMPOSTO_ISSQN();
            string issqn = string.Empty;
            double vBC = 0;
            double vAliq = 0;
            double vISSQN = 0;
            string cMunFG = string.Empty;
            int cListServ = 0;
            string cSitTrib = string.Empty;

            try 
	        {


                //Funcionalidade para gerar o XML do grupo do ISSQN - Imposto Sobre prestação de Serviços de Qualquer Natureza da NF-e
                foreach (OBJ_TB_NF_ITEM_IMPOSTO_ISSQN o_tb_nf_item_imposto_issqn in b_tb_nf_item_imposto_issqn.SelecionarLista(string.Format("tb_nf_item_imposto_issqn.id_nf_item={0}", o_tb_nf_item.id), ""))
                {
                    vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_issqn.valor_bc_issqn.ToString()));
                    vAliq = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_issqn.valor_aliq_issqn.ToString()));
                    vISSQN = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_item_imposto_issqn.valor_issqn.ToString()));
                    cListServ = Convert.ToInt32(o_tb_nf_item_imposto_issqn.id_servico_issqn.ToString());
                    cSitTrib = o_tb_nf_item_imposto_issqn.sit_trib_issqn.ToString();
                    issqn = util.ISSQN2G(vBC, vAliq, vISSQN, cMunFG, cListServ, cSitTrib);
                    break;
                }
   
                return issqn;
	        }
	        catch (Exception)
	        {
		
		        throw;
	        }

            
        }

        /// <summary>
        /// TOTAL
        /// </summary>
        /// <param name="ICMSTot"></param>
        /// <param name="ISSQNTot"></param>
        /// <param name="retTrib"></param>
        /// <returns></returns>
        public string Total(string nfe_ICMSTotal, string nfe_ISSQNTotal, string nfe_retTrib)
        {

            try
            {          
                NFe_Util_2G.Util util = new Util();
                string total = string.Empty;
                total = util.total(nfe_ICMSTotal, nfe_ISSQNTotal, nfe_retTrib);

                return total;
            }
            catch (Exception)
            {
                
                throw;
            }
         

        }
        
        /// <summary>
        /// Total Icms
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string TotalIcms(OBJ_TB_NF obj)
        {

            NFe_Util_2G.Util util = new Util();
            string totalIcms = string.Empty;

            // ** // informar o somatório da BC do ICMS (vBC) informado nos itens
            double	vBC = 0;
            // ** // informar o somatório de ICMS (vICMS) informado nos itens
            double	vICMS = 0;
            // ** // informar o somatório da BC ST (vBCST) informado nos itens
            double	vBCST = 0;
            // ** //  	informar o somatório do ICMS ST (vICMSST)informado nos itens
            double	vST = 0;
            // ** // informar o somatório de valor dos produtos (vProd) dos itens que tenham indicador de totalização = 1 (indTot)
            //     Os valores dos itens sujeitos ao ISSQN não devem ser acumulados neste campo.
            double	vProd	 = 0;
            // ** // informar o somatório de valor do Frete (vFrete) informado nos itens
            double	vFrete = 0;
            // ** // informar o somatório valor do Seguro (vSeg) informado nos itens
            double	vSeg = 0;
            // ** //  	informar o somatório do Desconto (vDesc) informado nos itens
            double	vDesc = 0;
            // ** //  	informar o somatório de II (vII) informado nos itens
            double	vII = 0;
            // ** // informar o somatório de IPI (vIPI) informado nos itens
            double	vIPI = 0;
            // ** //  	informar o somatório de PIS (vPIS) informado nos itens sujeitos ao ICMS
            double	vPIS = 0;
            // ** // informar o somatório de COFINS (vCOFINS) informado nos itens sujeitos ao ICMS
            double	vCOFINS = 0;
            // ** // informar o somatório de vOutro (vOutro) informado nos itens
            double	vOutro = 0;
            // ** // informar o valor total a NF
            //    Acrescentar o valor dos Serviços informados no grupo do ISSQN
            double vNF = 0;
	

            vBC     = Convert.ToDouble(PUB_FUNCOES.TrataDecimal( obj.valor_total_bc_icms.ToString()));
            vICMS   = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_icms.ToString()));
            vBCST   = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_bc_icms_st.ToString()));
            vST     = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_icms_st.ToString()));
            vProd   = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_produto.ToString()));
            vFrete  = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_frete.ToString()));
            vSeg    = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_seguro.ToString()));
            vDesc   = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_desconto.ToString()));
            vII     = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ii.ToString()));
            vIPI    = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ipi.ToString()));
            vPIS    = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ii.ToString()));
            vCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_cofins.ToString()));
            vOutro  = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_outro.ToString()));
            vNF     = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_nota_fiscal.ToString()));

            totalIcms = util.totalICMS(vBC, vICMS, vBCST, vST, vProd, vFrete, vSeg, vDesc, vII, vIPI, vPIS, vCOFINS, vOutro, vNF);

            return totalIcms;
        }

        /// <summary>
        /// Total ISSQN 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string TotalISSQN(OBJ_TB_NF obj)
        {

            NFe_Util_2G.Util util = new Util();

            string issqn = string.Empty;
            //informar o valor total do Serviços Pretados, é o somatório dos valores informados em vProd dos itens sujeitos ao ISSQN.
            // Os valores que sujeitos ao ISSQN deve ter o indTot informado com zero para evitar que o valor seja considerado na validação do somatório do vProd pela SEFAZ.
            double vServ = 0;
            // informar o somatório da BC do ISS informado nos itens de Serviços
            double vBC = 0;
            // informar o somatório de ISS informado nos itens de Serviços
            double vISS = 0;
            //  	informar o somatório de PIS informado nos itens de Serviços
            double vPIS = 0;
            // informar o somatório de COFINS informado nos itens de Serviços
            double vCOFINS = 0;

            try
            {
                vServ =Convert.ToDouble(PUB_FUNCOES.TrataDecimal( obj.valor_total_servico.ToString()));
                vBC = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_bc_issqn.ToString()));
                vISS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_issqn.ToString()));
                vPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_pis_issqn.ToString()));
                vCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_cofins_issqn.ToString()));

                issqn = util.totalISS(vServ, vBC, vISS, vPIS, vCOFINS);

                return issqn;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        /// <summary>
        /// Funcionalidade para gerar o XML do grupo de informações dos Tributos Federais Retidos
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string TributoRetido(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            string tribRetido = string.Empty;
            //informar o valor do PIS retido
            double vRetPIS = 0;
            // informar o valor COFINS do retido
            double vRetCOFINS = 0;
            // informar o valor do CSLL retido
            double vRetCSLL = 0;
            // informar o valor do BC IRRF retido
            double vBCIRRF = 0;
            // informar o valor do IRRF retido
            double vIRRF = 0;
            // informar o valor da BC da retenção da Previdência retido
            double vBCRetPrev = 0;
            // informar o valor da retenção da Previdência retido
            double vRetPrev = 0;

            try
            {

                vRetCOFINS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ret_cofins.ToString()));
                vRetCSLL = Convert.ToDouble(PUB_FUNCOES.TrataDecimal( obj.valor_total_ret_csll.ToString()));
                vRetPIS = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ret_pis.ToString()));
                vBCIRRF = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_bc_irrf.ToString()));
                vIRRF = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_irrf.ToString()));
                vBCRetPrev = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_bc_ret_prev.ToString()));
                vRetPrev = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(obj.valor_total_ret_prev.ToString()));

                tribRetido = util.tributoRetido(vRetPIS, vRetCOFINS, vRetCSLL, vBCIRRF, vIRRF, vBCRetPrev, vRetPrev);

                return tribRetido;

            }
            catch (Exception)
            {
                
                throw;
            }

        }

      

        /// <summary>
        /// Funcionalidade para gerar o XML dos dados do transportador
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string Transporta(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            
            OBJ_TB_CADASTRO o_tb_cadastro = new OBJ_TB_CADASTRO();
            BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();

            OBJ_TB_CADASTRO_FISICA o_tb_cadastro_fisica = new OBJ_TB_CADASTRO_FISICA();
            BLL_TB_CADASTRO_FISICA b_tb_cadastro_fisica = new BLL_TB_CADASTRO_FISICA();

            OBJ_TB_CADASTRO_JURIDICA o_tb_cadastro_juridica = new OBJ_TB_CADASTRO_JURIDICA();
            BLL_TB_CADASTRO_JURIDICA b_tb_cadastro_juridica = new BLL_TB_CADASTRO_JURIDICA();

            OBJ_TB_ENDERECO_CADASTRO o_tb_endereco_cadastro = new OBJ_TB_ENDERECO_CADASTRO();
            BLL_TB_ENDERECO_CADASTRO b_tb_endereco_cadastro = new BLL_TB_ENDERECO_CADASTRO();

            OBJ_TB_CIDADE o_tb_cidade = new OBJ_TB_CIDADE();
            BLL_TB_CIDADE b_tb_cidade = new BLL_TB_CIDADE();

            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();
            
            
            try
            {


                string transportadora = string.Empty;
                string CNPJ = string.Empty;
                string IE = string.Empty;
                string CPF = string.Empty;
                string xNome = string.Empty;
                string xEnder = string.Empty;
                string xMun = string.Empty;
                string UF = string.Empty;

                BLL_TB_NF_TRANSP b_tb_nf_transp = new BLL_TB_NF_TRANSP();
                // TRANSPORTADORA 
                foreach (OBJ_TB_NF_TRANSP o_tb_nf_transp in b_tb_nf_transp.SelecionarLista(string.Format("tb_nf_transp.id_nf = {0}", obj.id), ""))
                {


                    o_tb_cadastro = b_tb_cadastro.SelecionarObjetoPorId(o_tb_nf_transp.id_cadastro);
                    o_tb_endereco_cadastro = b_tb_endereco_cadastro.SelecionarObjetoPorIdCadastro(o_tb_nf_transp.id_cadastro);
                    o_tb_cidade = b_tb_cidade.SelecionarObjetoPorId(o_tb_nf_transp.id_cadastro);
                    o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_endereco_cadastro.id_uf);

                    if (o_tb_cadastro.pessoa == "F")
                    {
                        o_tb_cadastro_fisica = b_tb_cadastro_fisica.SelecionarObjetoPorId(o_tb_cadastro.id);
                        CPF = o_tb_cadastro_fisica.cpf.ToString();
                    }
                    else
                    {
                        o_tb_cadastro_juridica = b_tb_cadastro_juridica.SelecionarObjetoPorId(o_tb_cadastro.id);
                        CNPJ = o_tb_cadastro_juridica.cnpj.ToString();
                    }
                    IE = o_tb_cadastro_juridica.insc_est.ToString();
                    xNome = o_tb_cadastro.nome.ToString();
                    xEnder = o_tb_endereco_cadastro.endereco.ToString();
                    xMun = o_tb_cidade.cidade.ToString();
                    UF = o_tb_uf.uf.ToString();
                    
                }
                transportadora = util.transporta(CNPJ, CPF,xNome,IE,xEnder,xMun,UF);
                return transportadora;
            }
            catch (Exception)
            {
                
                throw;
            }

        }


        /// <summary>
        /// Retenção Tributo Transportadora
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string RetTransporte(OBJ_TB_NF obj)
        {
                NFe_Util_2G.Util util = new Util();
                BLL_TB_NF_TRANSP_TRIB_RET b_tb_nf_transp_trib_ret = new BLL_TB_NF_TRANSP_TRIB_RET();
                string tribTransp = string.Empty;
                double vServ = 0;
                double vBCRet = 0;
                double pICMSRet = 0;
                double vICMSRet = 0;
                int CFOP = 0;
                string cMunFG = string.Empty;

                try
                {

                    foreach (OBJ_TB_NF_TRANSP_TRIB_RET o_tb_nf_transp_trib_ret in b_tb_nf_transp_trib_ret.SelecionarLista(string.Format("tb_nf_transp_trib_ret.id_nf = {0}", obj.id), ""))
                    {
                        vServ = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_trib_ret.valor_servico.ToString()));
                        vBCRet = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_trib_ret.valor_bc_icms_ret.ToString()));
                        pICMSRet = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_trib_ret.valor_aliq_icms_ret.ToString()));
                        vICMSRet = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_trib_ret.valor_icms_ret.ToString()));
                        CFOP = Convert.ToInt32(o_tb_nf_transp_trib_ret.cfop.ToString());
                        cMunFG = o_tb_nf_transp_trib_ret.cidade_ibge_gerador.ToString();

                        break;
                    }

                    tribTransp = util.retTransp(vServ, vBCRet, pICMSRet, vICMSRet, CFOP, cMunFG);

                    return tribTransp;
                }
                catch (Exception)
                {
                    
                    throw;
                }
            
        }


        /// <summary>
        /// Veiculo Transportadora
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string VeiculoTransporte(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();            
            string veiculoTransp = string.Empty;
            string placa = string.Empty;
            string UF = string.Empty;
            string RNTC = string.Empty;

            BLL_TB_NF_TRANSP_VEICULO b_tb_nf_transp_veiculo = new BLL_TB_NF_TRANSP_VEICULO();

            try
            {

                foreach (OBJ_TB_NF_TRANSP_VEICULO o_tb_nf_transp_veiculo in b_tb_nf_transp_veiculo.SelecionarLista(string.Format("tb_nf_transp_veiculo.id_nf = {0}", obj.id), ""))
                {
                    placa = o_tb_nf_transp_veiculo.placa.ToString();
                    UF = o_tb_nf_transp_veiculo.uf.ToString();
                    RNTC = o_tb_nf_transp_veiculo.RNTC.ToString();
                    break;
                }

                veiculoTransp = util.veicTransp(placa, UF, RNTC);
                return veiculoTransp;
            }
            catch (Exception)
            {
                
                throw;
            }
        }


        /// <summary>
        /// Reboque Transportadora
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string ReboqueTransporte(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            StringBuilder reboqueTransp = new StringBuilder();
            string placa = string.Empty;
            string UF = string.Empty;
            string RNTC = string.Empty;


            try
            {
                BLL_TB_NF_TRANSP_REBOQUE b_tb_nf_transp_reboque = new BLL_TB_NF_TRANSP_REBOQUE();

                foreach (OBJ_TB_NF_TRANSP_REBOQUE o_tb_nf_transp_reboque in b_tb_nf_transp_reboque.SelecionarLista(string.Format("tb_nf_transp_reboque.id_nf = {0}", obj.id), ""))
                {
                    placa = o_tb_nf_transp_reboque.placa.ToString();
                    UF = o_tb_nf_transp_reboque.uf.ToString();
                    RNTC = o_tb_nf_transp_reboque.RNTC.ToString();

                    reboqueTransp.Append(util.reboque(placa, UF, RNTC));
                }

                
               
                return reboqueTransp.ToString();
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// Volume Transporte
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string VolumeTransporte(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            StringBuilder volume = new StringBuilder();
            double qVol = 0;
            string esp = string.Empty;
            string marca = string.Empty;
            string nVol = string.Empty;
            double pesoL = 0;
            double pesoB = 0;
            string lacres = string.Empty;


            try
            {
                BLL_TB_NF_TRANSP_VOLUME b_tb_nf_transp_volume = new BLL_TB_NF_TRANSP_VOLUME();

                foreach (OBJ_TB_NF_TRANSP_VOLUME o_tb_nf_transp_volume in b_tb_nf_transp_volume.SelecionarLista(string.Format("tb_nf_transp_volume.id_nf = {0}", obj.id), ""))
                {
                    qVol = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_volume.qVol.ToString()));
                    esp = o_tb_nf_transp_volume.esp.ToString();
                    marca = o_tb_nf_transp_volume.marca.ToString();
                    nVol = o_tb_nf_transp_volume.nVol.ToString();
                    pesoB = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_volume.pesoB.ToString()));
                    pesoL = Convert.ToDouble(PUB_FUNCOES.TrataDecimal(o_tb_nf_transp_volume.pesoL.ToString()));
                    lacres = nfe_lacres;

                    volume.Append(util.vol(qVol, esp, marca, nVol, pesoL, pesoB, lacres));
                }

                

                return volume.ToString();

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public string Lacres(OBJ_TB_NF_TRANSP_LACRES obj)
        {
            try
            {
                NFe_Util_2G.Util util = new Util();
                string nlacre = string.Empty;
                return util.lacres(nlacre);

            }
            catch (Exception)
            {
                
                throw;
            }
          
        }


        /// <summary>
        /// Funcionalidade para gerar o XML dos dados do transporte da NF-e versão 2.00
        /// </summary>
        /// <param name="modFrete"></param>
        /// <param name="nfe_transporta"></param>
        /// <param name="nfe_retTransp"></param>
        /// <param name="nfe_veicTransp"></param>
        /// <param name="nfe_reboque"></param>
        /// <param name="nfe_vagao"></param>
        /// <param name="nfe_balsa"></param>
        /// <param name="nfe_vol"></param>
        /// <returns></returns>
        public string Transportador2G(String modFrete, string nfe_transporta, string nfe_retTransp, string nfe_veicTransp, string nfe_reboque, string nfe_vagao, string nfe_balsa, string nfe_vol)
        {
            NFe_Util_2G.Util util = new Util();
            string transportador = string.Empty;
            string modelofrete = string.Empty;
            string retTransp = string.Empty;
            string transporta = string.Empty;
            string veicTransp = string.Empty;
            string reboque = string.Empty;
            string vagao = string.Empty;
            string balsa = string.Empty;
            string vol = string.Empty;

            try
            {

                modelofrete = modFrete;
                transporta = nfe_transporta;
                veicTransp = nfe_retTransp;
                reboque = nfe_reboque;
                vagao = nfe_vagao;
                balsa   = nfe_balsa;
                vol = nfe_vol;

                transportador =util.transportador2G(modFrete, transporta, retTransp, veicTransp, reboque,vagao,balsa,vol);
                return transportador;
            }
            catch (Exception)
            {
                
                throw;
            }

        }
        /// <summary>
        /// Funcionalidade para gerar o XML com a informação da NF-e referenciada.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string NFeRef(OBJ_TB_NF  obj)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_REF_NFE b_tb_nf_ref_nfe = new BLL_TB_NF_REF_NFE();
            // informar a chave de acesso da NF-e referenciada
            StringBuilder refNfe = new StringBuilder();

            try
            {

                foreach (OBJ_TB_NF_REF_NFE o_tb_nf_ref_nfe in b_tb_nf_ref_nfe.SelecionarLista(string.Format("tb_nf_ref_nfe.id_nf = {0}", obj.id), ""))
                {
                    refNfe.Append(util.NFeRef(o_tb_nf_ref_nfe.refNFe.ToString()));
                }

                return refNfe.ToString();

            }
            catch (Exception)
            {
                
                throw;
            }
         

        }


        /// <summary>
        /// Funcionalidade para gerar o XML com a informação da NF modelo 1/1A referenciada.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string NFRef(OBJ_TB_NF obj)
        {

            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_REF_1A b_tb_nf_ref_1a = new BLL_TB_NF_REF_1A();
            StringBuilder nfref = new StringBuilder();
            // informar o código da UF de localização do emissor da NF no padrão do IBGE
            int cUF = 0;
            // informar o ano e mês de emisssão da NF referenciada no padrão AAMM
            string AAMM = string.Empty;
            // informar o CNPJ do emissor da NF
            string CNPJ = string.Empty;
            // informar o modelo da NF referenciada, deve ser sempre 1.
            int mod = 0;
            // informar o número da série da NF referenciada, informar zero se for série única
            int serie = 0;

            // informar o número da NF referenciada
            int nNF = 0;

            try
            {

                foreach (OBJ_TB_NF_REF_1A o_tb_nf_ref_1a in b_tb_nf_ref_1a.SelecionarLista(string.Format("tb_nf_ref_1A.id_nf = {0}", obj.id), ""))
                {
                    nfref.Append(util.NFRef(cUF, AAMM, CNPJ, mod, serie, nNF));
                }

                

               return nfref.ToString();

            }
            catch (Exception)
            {
                
                throw;
            }

        }

        /// <summary>
        /// Funcionalidade para gerar o XML com a informação da NF de produtor referenciada.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string NFRefP(OBJ_TB_NF_REF_PRODUTOR obj)
        {
            NFe_Util_2G.Util util = new Util();
            string nfrefp = string.Empty;
            // informar o código da UF de localização do emissor da NF no padrão do IBGE
            int cUF = 0;
            // informar o ano e mês de emisssão da NF referenciada no padrão AAMM
            string AAMM = string.Empty;
            // informar o CNPJ do emissor da NF, informar "" se informado o CPF
            string CNPJ = string.Empty;
            // informar o CPF do emissor da NF, informar "" se informado o CNPJ
            string CPF = string.Empty;
            // informar a IE do produtor, permitido informar a literal "ISENTO"
            string IE = string.Empty;
            // informar o modelo da NF referenciada, 1 ou 4
            int mod = 0;
            // informar o número da série da NF referenciada, informar zero se for série única
            int serie = 0;
            // informar o número da NF referenciada
            int nNF = 0;

            try
            {
                cUF = obj.cUF;
                AAMM = obj.AAMM.ToString();
                CNPJ = obj.CNPJ.ToString();
                CPF = obj.CPF.ToString();
                IE = obj.IE.ToString();
                mod = obj.mod;
                serie = obj.serie;
                nNF = obj.nNF;

                nfrefp = util.NFRefP(cUF, AAMM, CNPJ, CPF, IE, mod, serie, nNF);
                return nfrefp;

            }
            catch (Exception)
            {
                
                throw;
            }

        }

        /// <summary>
        /// Funcionalidade para gerar o XML com a informação do CT-e referenciado.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string CTeRef(OBJ_TB_NF_CTE_REF obj)
        {

            NFe_Util_2G.Util util = new Util();

            string refCTe = string.Empty;

            try
            {
                refCTe = obj.refCTe;
                return util.CTeRef(refCTe);
            }
            catch (Exception)
            {
                
                throw;
            }

        }

        /// <summary>
        /// Funcionalidade para gerar o XML com a informação do Cupom Fiscal referenciado.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string ECFRef(OBJ_TB_NF_ECF_REF obj)
        {
            NFe_Util_2G.Util util = new Util();

            // Informar o código do modelo do Documento Fiscal, Preencher com: 
            //    "2B", quando se tratar de Cupom Fiscal emitido por máquina registradora (não ECF),
            //    "2C", quando se tratar de Cupom Fiscal PDV; 
            //    "2D", quando se tratar de Cupom Fiscal (emitido por ECF)
            string mod = string.Empty;
            // Informar o número de ordem seqüencial do ECF que emitiu o Cupom Fiscal vinculado à NF-e
            int nECF = 0;
            // Informar o Número do Contador de Ordem de Operação - COO vinculado à NF-e
            int nCOO = 0;

            try
            {

                mod = obj.mod.ToString();
                nECF = obj.nECF;
                nCOO = obj.nCOO;
                return util.ECFRef(mod, nECF, nCOO);

            }
            catch (Exception)
            {
                
                throw;
            }


        }

        /// <summary>
        /// Funcionalidade para gerar o XML de Informações Adicionais da NF-e versão 2.00
        /// </summary>
        /// <param name="infAdFisco"></param>
        /// <param name="infCpl"></param>
        /// <param name="nfe_obsCont"></param>
        /// <param name="nfe_obsFisco"></param>
        /// <param name="nfe_procRef"></param>
        /// <returns></returns>
        public string infAdic2G( string infAdFisco, string infCpl, string nfe_obsCont, string nfe_obsFisco, string nfe_procRef)
        {
            NFe_Util_2G.Util util = new Util();
            try
            {
                return util.infAdic2G(infAdFisco, infCpl, nfe_obsCont, nfe_obsFisco, nfe_procRef);
            }
            catch (Exception)
            {
                
                throw;
            }
          

        }


        /// <summary>
        /// Funcionalidade para gerar o XML de Observação do Contribuinte
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string obsCont(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_OBS_CONTRIBUINTE b_tb_nf_obs_contribuinte = new BLL_TB_NF_OBS_CONTRIBUINTE();
            string xCampo = string.Empty;
            string xTexto = string.Empty;

            try
            {


                foreach (OBJ_TB_NF_OBS_CONTRIBUINTE o_tb_nf_obs_contribuinte in b_tb_nf_obs_contribuinte.SelecionarLista(string.Format("tb_nf_obs_contribuinte.id_nf = {0}", obj.id), ""))
                {

                    xCampo = o_tb_nf_obs_contribuinte.xCampo.ToString();
                    xTexto = o_tb_nf_obs_contribuinte.xTexto.ToString();
                    break;
                }

                return util.obsCont(xCampo, xTexto);
            }
            catch (Exception)
            {
                
                throw;
            }
         
        }


        /// <summary>
        /// Funcionalidade para gerar o XML de Observação do Fisco
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string obsFisco(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_OBS_FISCO b_tb_nf_obs_fisco = new BLL_TB_NF_OBS_FISCO();
            string xCampo = string.Empty;
            string xTexto = string.Empty;

            try
            {


                foreach (OBJ_TB_NF_OBS_FISCO o_tb_nf_obs_fisco in b_tb_nf_obs_fisco.SelecionarLista(string.Format("tb_nf_obs_fisco.id_nf = {0}", obj.id), ""))
                {
                    xCampo = o_tb_nf_obs_fisco.xCampo.ToString();
                    xTexto = o_tb_nf_obs_fisco.xTexto.ToString();
                    break;
                }



             
                return util.obsFisco(xCampo, xTexto);
            }
            catch (Exception)
            {

                throw;
            }
        }


        /// <summary>
        /// Funcionalidade para gerar o XML com os dados do processo Referenciado
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string procRef(OBJ_TB_NF obj)
        {
            NFe_Util_2G.Util util = new Util();
            BLL_TB_NF_PROCESSO_REF b_tb_nf_processo_ref = new BLL_TB_NF_PROCESSO_REF();
            StringBuilder processoRef = new StringBuilder();
            string nProc = string.Empty;
            int indProc = 0;
            try
            {


                foreach (OBJ_TB_NF_PROCESSO_REF o_tb_nf_processo_ref in b_tb_nf_processo_ref.SelecionarLista(string.Format("tb_nf_processo_ref.id_nf = {0}", obj.id), ""))
                {
                    processoRef.Append(util.procRef(nProc, indProc));

                }

               
                return processoRef.ToString();
            }
            catch (Exception)
            {
                
                throw;
            }

        }


        /// <summary>
        /// Funcionalidade para gerar o XML de Cobrança da NF-e
        /// </summary>
        /// <param name="nFat"></param>
        /// <param name="vOrig"></param>
        /// <param name="vDesc"></param>
        /// <param name="vLiq"></param>
        /// <param name="nfe_duplicata"></param>
        /// <returns></returns>
        public string Cobranca(OBJ_TB_NF obj)
        {
           
            string nFat  = string.Empty;
            double vOrig  = 0;
            double vDesc  = 0;
            double vLiq = 0;
            string nfe_duplicata = string.Empty;

            StringBuilder sDuplicata = new StringBuilder();
            NFe_Util_2G.Util util = new Util();

            BLL_TB_CONTA_RECEBER b_tb_conta_receber = new BLL_TB_CONTA_RECEBER();

            foreach(OBJ_TB_CONTA_RECEBER o_tb_conta_receber in b_tb_conta_receber.SelecionarLista(string.Format("tb_conta_receber.id in (select id_conta_receber from tb_conta_receber_nf where id_nf in ({0})) ", obj.id ), ""))
            {
               nFat = o_tb_conta_receber.documento.ToString();
               vOrig = vOrig + Convert.ToDouble(o_tb_conta_receber.valor_parcela);
               vDesc = vDesc + Convert.ToDouble(o_tb_conta_receber.valor_desconto);
               vLiq =  vLiq +  (vOrig - vDesc);
               sDuplicata.Append(Duplicata(o_tb_conta_receber.documento.ToString(),Convert.ToDateTime( o_tb_conta_receber.dt_vencimento), Convert.ToDouble(o_tb_conta_receber.valor_parcela)));
            }

            
            nfe_duplicata = sDuplicata.ToString();

            return util.cobr(nFat, vOrig, vDesc, vLiq, nfe_duplicata);

        }

        /// <summary>
        /// Funcionalidade para gerar o XML da Duplicatas da NF-e
        /// </summary>
        /// <param name="nDup"></param>
        /// <param name="dVenc"></param>
        /// <param name="vDup"></param>
        /// <returns></returns>
        public string Duplicata(string nDup, DateTime dVenc, double vDup)
        {

            NFe_Util_2G.Util util = new Util();
            return util.dup(nDup, dVenc, vDup);
        }


        /// <summary>
        /// Funcionalidade para gerar o XML do grupo de Compras Públicas
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string Compra(OBJ_TB_NF_COMPRA obj)
        {
            NFe_Util_2G.Util util = new Util();
            string compra = string.Empty;
            string xNEmp = string.Empty;
            string xPed = string.Empty;
            string xCont = string.Empty;


            try
            {

                xNEmp = obj.xNEmp.ToString();
                xPed = obj.xPedido.ToString();
                xCont = obj.xCont.ToString();

                compra = util.compra(xNEmp, xPed, xCont);
                return compra;  
            }
            catch (Exception)
            {
                
                throw;
            }

        }


         /// <summary>
        /// Funcionalidade para consolidar a NF-e. compatível com a versão 2.00, é a última etapa da geração da NF-e e todos os fragmentos da NF-e devem ter sido
         /// </summary>
         /// <param name="versao"></param>
         /// <param name="Id"></param>
         /// <param name="ide"></param>
         /// <param name="emit"></param>
         /// <param name="avulsa"></param>
         /// <param name="dest"></param>
         /// <param name="retirada"></param>
         /// <param name="entrega"></param>
         /// <param name="detalhes"></param>
         /// <param name="total"></param>
         /// <param name="transp"></param>
         /// <param name="cobr"></param>
         /// <param name="infAdic"></param>
         /// <param name="exporta"></param>
         /// <param name="compra"></param>
         /// <param name="cana"></param>
         /// <returns></returns>
        public string NFe2G(string versao, string  Id, string ide, string emit, string avulsa, string dest, string retirada, string entrega, string detalhes, string total, string transp, string cobr, string infAdic, string exporta, string compra, string cana)
        {

            NFe_Util_2G.Util util = new Util();

            try
            {
                return util.NFe2G(versao, Id, ide, emit, avulsa, dest, retirada, entrega, detalhes, total, transp, cobr, infAdic, exporta, compra, cana);
            }
            catch (Exception)
            {
                
                throw;
            }
         

        }

        /// <summary>
        /// Versao 2.00
        /// </summary>
        /// <returns></returns>
        public string Versao()
        {            
            return "2.00";
        }

        public string Versao(OBJ_TB_NF obj)
        {
            try
            {
                OBJ_TB_NF_VERSAO o_tb_nf_versao = new OBJ_TB_NF_VERSAO();
                BLL_TB_NF_VERSAO b_tb_nf_versao = new BLL_TB_NF_VERSAO();
                string versao = string.Empty;
                o_tb_nf_versao = b_tb_nf_versao.SelecionarObjetoPorId(obj.id_versao);
                versao = o_tb_nf_versao.desc_versao.ToString();

                return versao;
            }
            catch (Exception)
            {
                
                throw;
            }
            
        }

        public void ConsultaNFe2G(string siglaWS, int tipoAmbiente, string NomeCertificado, string versao, out string msgDados, out string msgRetWS, out string msgResultado, string chaveNFe, string proxy, string usuario, string senha)
        {
            NFe_Util_2G.Util util = new Util();
            util.ConsultaNF2G(siglaWS, tipoAmbiente,NomeCertificado,versao,out msgDados,out msgRetWS, out msgResultado, chaveNFe, proxy, usuario, senha);
        }

        public void NomeCertificado(ref string Nome, out string MsgResultado)
        {
            try
            {
                NFe_Util_2G.Util util = new Util();
                util.PegaNomeCertificado(ref Nome, out MsgResultado);
            }
            catch (Exception)
            {
                
                throw;
            }
           
        }


        public string InutilizaNroNF2G(OBJ_TB_NF obj, string justificativa, out string msgDados, out string msgRetWS, out int cStat, out string msgResultado, out string nProtocoloInut, out string dProtocoloInut)
        {

            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();


            BLL_TB_NF_VERSAO b_tb_nf_versao = new BLL_TB_NF_VERSAO();
            OBJ_TB_NF_VERSAO o_tb_nf_versao = new OBJ_TB_NF_VERSAO();

            BLL_TB_UF b_tb_uf = new BLL_TB_UF();
            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            

            string siglaWS = string.Empty;
            int tipoAmbiente ;
            string cert = string.Empty;
            string versao = string.Empty;     
            string chaveNFe = string.Empty;            
            string chave = string.Empty;
            string nProtocolo = string.Empty;   
            string proxy = string.Empty;
            string usuario = string.Empty;
            string senha = string.Empty;
            string licenca = string.Empty;
            string cUF = string.Empty;
            string ano = string.Empty;
            string CNPJ = string.Empty;
            string modelo = string.Empty;
            string serie = string.Empty;
            string nroNFeInicial = string.Empty;
            string nroNFeFinal = string.Empty;
            string procInutNFe = string.Empty;

            NFe_Util_2G.Util util = new Util();
            try
            {

                o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);
                o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_nf_parametro.id_uf);

                if (o_tb_nf_parametro.sit_usa_proxy)
                {
                    usuario = o_tb_nf_parametro.usuario_proxy.ToString();
                    proxy = o_tb_nf_parametro.url_proxy.ToString();
                    senha = o_tb_nf_parametro.senha_proxy.ToString();
                }
                
                licenca = o_tb_nf_parametro.licenca.ToString();
                tipoAmbiente = Convert.ToInt32(o_tb_nf_parametro.id_tipo_ambiente);
                o_tb_nf_versao = b_tb_nf_versao.SelecionarObjetoPorId(obj.id_versao);
                versao = o_tb_nf_versao.desc_versao.ToString();
                siglaWS = SiglaWS(o_tb_nf_parametro);
                cert = Certificado(o_tb_nf_parametro);

                procInutNFe = util.InutilizaNroNF2G(siglaWS, tipoAmbiente, cert, versao, out msgDados, out msgRetWS, out cStat, out msgResultado, cUF, ano, CNPJ, modelo, serie, nroNFeInicial, nroNFeFinal, justificativa, out nProtocoloInut, out dProtocoloInut, proxy, usuario, senha, licenca);

                return procInutNFe;

            }
            catch (Exception)
            {
                
                throw;
            }
            

        }


        public string CancelaNFEvento(OBJ_TB_NF o_tb_nf, out string msgDados, out string msgRetWS, out int cStat, out string msgResultado, string justificativa, string dhEvento, out string nProtocoloCanc, out string dProtocoloCanc)
        {

            NFe_Util_2G.Util util = new Util();
            string siglaWS = string.Empty;
            int tipoAmbiente = 0;
            string cert = string.Empty;
            string versao = string.Empty;     
            string chaveNFe = string.Empty;            
            string chave = string.Empty;
            string nProtocolo = string.Empty;   
            string proxy = string.Empty;
            string usuario = string.Empty;
            string senha = string.Empty;
            string licenca = string.Empty;
            string procCancNFe = string.Empty;

            try
            {
                procCancNFe = util.CancelaNFEvento(siglaWS, tipoAmbiente, cert, versao, out msgDados, out  msgRetWS, out cStat, out msgResultado, chaveNFe, nProtocolo, justificativa, dhEvento, out  nProtocoloCanc, out dProtocoloCanc, proxy, usuario, senha, licenca);

                return procCancNFe;
            }
            catch (Exception)
            {
                
                throw;
            }
            
        }


        /// <summary>
        /// Cancelar NFe
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="msgDados"></param>
        /// <param name="retWS"></param>
        /// <param name="resultado"></param>
        /// <param name="msgResultado"></param>
        /// <param name="justificativa"></param>
        /// <param name="nProtocoloCanc"></param>
        /// <param name="dProtocoloCanc"></param>
        /// <returns></returns>

        public string CancelaNFe2G(OBJ_TB_NF obj, out string msgDados, out string retWS, out int resultado, out string msgResultado, string justificativa, string nProtocoloCanc, string dProtocoloCanc)
        {

            NFe_Util_2G.Util util = new Util();
            string siglaWS = string.Empty;
            int tipoAmbiente;
            string cert = string.Empty;
            string versao = string.Empty;     
            string chaveNFe = string.Empty;            
            string chave = string.Empty;
            string nProtocolo = string.Empty;   
            string proxy = string.Empty;
            string usuario = string.Empty;
            string senha = string.Empty;
            string licenca = string.Empty;

            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();


            BLL_TB_NF_VERSAO b_tb_nf_versao = new BLL_TB_NF_VERSAO();
            OBJ_TB_NF_VERSAO o_tb_nf_versao = new OBJ_TB_NF_VERSAO();

            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();
            

            try
            {
                o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);                

                if (o_tb_nf_parametro.sit_usa_proxy)
                {
                    usuario = o_tb_nf_parametro.usuario_proxy.ToString();
                    proxy = o_tb_nf_parametro.url_proxy.ToString();
                    senha = o_tb_nf_parametro.senha_proxy.ToString();
                }
                


                licenca = o_tb_nf_parametro.licenca.ToString();
                tipoAmbiente = Convert.ToInt32(o_tb_nf_parametro.id_tipo_ambiente);
                o_tb_nf_versao = b_tb_nf_versao.SelecionarObjetoPorId(obj.id_versao);                    
                versao = o_tb_nf_versao.desc_versao.ToString();
                siglaWS = SiglaWS(o_tb_nf_parametro);
                cert = Certificado(o_tb_nf_parametro);


                return util.CancelaNF2G(siglaWS, tipoAmbiente, cert, versao, out msgDados, out retWS, out resultado, out msgResultado, chaveNFe, nProtocolo, justificativa, out nProtocoloCanc, out dProtocoloCanc, proxy, usuario, senha, licenca);
            }
            catch (Exception)
            {
                
                throw;
            }

          
        }


        /// <summary>
        /// Validar Assinatura
        /// </summary>
        /// <param name="XML"></param>
        /// <param name="msgResultado"></param>
        /// <param name="Titular"></param>
        /// <param name="CNPJ"></param>
        /// <param name="NroSerie"></param>
        /// <param name="Emissor"></param>
        /// <param name="InicioValidade"></param>
        /// <param name="FimValidade"></param>
        /// <returns></returns>
        public int ValidarAssinatura(string XML, out string msgResultado, out string Titular, out string CNPJ, out string NroSerie, out string Emissor, out string InicioValidade, out string FimValidade)
        {
            NFe_Util_2G.Util util = new Util();

            return util.ValidaAssinatura(XML, out msgResultado, out Titular, out CNPJ, out NroSerie, out Emissor, out InicioValidade, out FimValidade);

        }




        /// <summary>
        /// Assinar XML
        /// </summary>
        /// <param name="id_empresa"></param>
        /// <param name="XMLString"></param>
        /// <param name="RefUri"></param>
        /// <param name="resultado"></param>
        /// <param name="msgResultado"></param>
        /// <returns></returns>
        public string Assinar(OBJ_TB_NF obj, string XMLString, string RefUri, out int resultado, out string msgResultado)
        {
            try
            {
                OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
                BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();


                o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

                NFe_Util_2G.Util util = new Util();

                string path = string.Empty;
                string cert = string.Empty;
                string NomeCertificado = string.Empty;
                string SenhaCertificado = string.Empty;

                path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_certificado.ToString());
                NomeCertificado = o_tb_nf_parametro.nome_certificado.ToString();
                SenhaCertificado = o_tb_nf_parametro.senha_certificado.ToString();

                cert = Certificado(o_tb_nf_parametro);

                return util.Assinar(XMLString, RefUri, cert, out resultado, out msgResultado);

            }
            catch (Exception)
            {

                throw;
            }

        }

        //public string CarregarXML(OBJ_TB_NF obj)
        //{
        //    try 
        //    {	        
        //        BLL_TB_NF_XML_VENDA b_tb_nf_xml_venda = new BLL_TB_NF_XML_VENDA();              
        //        BLL_TB_NF_XML_COMPRA b_tb_nf_xml_compra = new BLL_TB_NF_XML_COMPRA();
          
                           
        //        string full_name = string.Empty;
        //        string nfe_xml = string.Empty;
        //        if (Equals(obj.id_operacao, (int)PUB_ENUM.NF_OPERACAO.SAIDA))
        //        {
        //            foreach (OBJ_TB_NF_XML_VENDA xml_venda in b_tb_nf_xml_venda.SelecionarLista(string.Format("tb_nf_xml_venda.id_nf={0} and tb_nf_xml_venda.id_status = {1}", obj.id, obj.id_status), "tb_nf_xml_venda.id desc"))
        //            {

        //                full_name = string.Format(@"{0}\{1}", xml_venda.path, xml_venda.arquivo);

        //                if (PUB_FUNCOES.ExisteArquivo(full_name))
        //                {
        //                    FileStream fs = File.Open(full_name, FileMode.Open);
        //                    BufferedStream bs = new BufferedStream(fs);
        //                    StreamReader sr = new StreamReader(bs);

        //                    nfe_xml = sr.ReadToEnd();

        //                    sr.Close();
        //                    bs.Close();
        //                    fs.Close();


        //                    break;
        //                }

                       
        //            }

        //            return nfe_xml;
                    
        //        }
        //        else
        //        {
        //            foreach (OBJ_TB_NF_XML_COMPRA xml_compra in b_tb_nf_xml_compra.SelecionarLista(string.Format("tb_nf_xml_compra.id_nf={0} and tb_nf_xml_compra.id_status = {1}", obj.id, obj.id_status), "tb_nf_xml_compra.id desc"))
        //            {

        //                full_name = string.Format(@"{0}\\{1}", xml_compra.path, xml_compra.arquivo);

        //                if (PUB_FUNCOES.ExisteArquivo(full_name))
        //                {
        //                    FileStream fs = new FileStream(full_name, FileMode.Open);
        //                    BufferedStream bs = new BufferedStream(fs);
        //                    StreamReader sr = new StreamReader(bs);

        //                    nfe_xml = sr.ReadToEnd();

        //                    sr.Close();
        //                    bs.Close();
        //                    fs.Close();


        //                    break;
        //                }


                      
        //            }

        //            return nfe_xml;
        //        }
        //    }
        //    catch (Exception)
        //    {
		
        //        throw;
        //    }
          



        //}

        public string CarregarXML(OBJ_TB_NF obj, int status)
        {
            try
            {
                BLL_TB_NF_XML_VENDA b_tb_nf_xml_venda = new BLL_TB_NF_XML_VENDA();
                BLL_TB_NF_XML_COMPRA b_tb_nf_xml_compra = new BLL_TB_NF_XML_COMPRA();

                string path_relativo = string.Empty;
                string full_name = string.Empty;
                string nfe_xml = string.Empty;
                if (Equals(obj.id_operacao, (int)PUB_ENUM.NF_OPERACAO.SAIDA))
                {
                    foreach (OBJ_TB_NF_XML_VENDA xml_venda in b_tb_nf_xml_venda.SelecionarLista(string.Format("tb_nf_xml_venda.id_nf={0} and tb_nf_xml_venda.id_status = {1}", obj.id, status), "tb_nf_xml_venda.id desc"))
                    {
                        path_relativo = HttpContext.Current.Server.MapPath(xml_venda.path_relativo);
                        full_name = string.Format(@"{0}\{1}", path_relativo, xml_venda.arquivo);

                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                        {
                            FileStream fs = File.Open(full_name, FileMode.Open);
                            BufferedStream bs = new BufferedStream(fs);
                            StreamReader sr = new StreamReader(bs);

                            nfe_xml = sr.ReadToEnd();

                            sr.Close();
                            bs.Close();
                            fs.Close();


                            break;
                        }


                    }

                    return nfe_xml;

                }
                else
                {
                    foreach (OBJ_TB_NF_XML_COMPRA xml_compra in b_tb_nf_xml_compra.SelecionarLista(string.Format("tb_nf_xml_compra.id_nf={0} and tb_nf_xml_compra.id_status = {1}", obj.id, status), "tb_nf_xml_compra.id desc"))
                    {

                        full_name = string.Format(@"{0}\\{1}", xml_compra.path, xml_compra.arquivo);

                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                        {
                            FileStream fs = new FileStream(full_name, FileMode.Open);
                            BufferedStream bs = new BufferedStream(fs);
                            StreamReader sr = new StreamReader(bs);

                            nfe_xml = sr.ReadToEnd();

                            sr.Close();
                            bs.Close();
                            fs.Close();


                            break;
                        }



                    }

                    return nfe_xml;
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        

        public int GerarPDF(string XML, out string msgResultado)
        {
            NFe_Util_2G.Util util = new Util();

            string quadroRecibo = string.Empty;
            string quadroFatura = string.Empty;
            string quadroISSQN = string.Empty;
            string DPEC = string.Empty; 
            string separadorItem = string.Empty; 
            string gravaPDF = string.Empty;
            string logo = string.Empty;


            quadroRecibo = "S" ; //             ' quadro do recibo no topo
            quadroFatura = "S" ; //              ' imprimir o quadro de Fatura/Duplicatas
            quadroISSQN = "S"  ; //             ' imprimir o quadro de ISSQN
            DPEC = ""          ; //             ' informar quando a NF-e tiver sido emitido em contingência DPEC
            separadorItem = "T" ; //            ' traço para separar o item quando o item ocupar mais de uma linha
            gravaPDF = ""; //    
            return util.geraPdfDANFE(XML, logo, quadroRecibo, quadroFatura, quadroISSQN, DPEC, separadorItem, gravaPDF, out msgResultado);

        }


        public int ValidarXML(string XML, int tipoXML, out string msgResultado, out int qtdeErros, out string erroXML)
        {
            try
            {
                NFe_Util_2G.Util util = new Util();
                return util.ValidaXML(XML, tipoXML, out msgResultado, out qtdeErros, out erroXML);    
            }
            catch (Exception)
            {
                
                throw;
            }
                   
        }


        public string BuscaNFe2G(OBJ_TB_NF obj, ref string NFeAssinada, string nroRecibo, out string msgDados, out string msgRetWS, out int cStat, out string msgResultado, out string nroProtocolo, out string dhProtocolo, out string cMsg, out string xMsg)
        {
            NFe_Util_2G.Util util = new Util();

            BLL_TB_NF b_tb_nf = new BLL_TB_NF();
            OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();

            BLL_TB_UF b_tb_uf = new BLL_TB_UF();
            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();


            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();
            BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();

            OBJ_TB_NF_VERSAO o_tb_nf_versao = new OBJ_TB_NF_VERSAO();
            BLL_TB_NF_VERSAO b_tb_nf_versao = new BLL_TB_NF_VERSAO();

            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();

            string path = string.Empty;
            string cert = string.Empty;
            string NomeCertificado = string.Empty;
            string SenhaCertificado = string.Empty;
            string siglaWS = string.Empty;
            string proxy = string.Empty;
            string usuario = string.Empty;
            string senha = string.Empty;
            string licenca = string.Empty;
            string versao = string.Empty;
            int tipoAmbiente ;

            o_tb_endereco_empresa = b_tb_endereco_empresa.SelecionarObjetoPorIdEmpresa(obj.id_empresa);
            o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

            o_tb_nf_versao = b_tb_nf_versao.SelecionarObjetoPorId(obj.id_versao);
            o_tb_uf = b_tb_uf.SelecionarObjetoPorId(o_tb_endereco_empresa.id_uf);

            tipoAmbiente = o_tb_nf_parametro.id_tipo_ambiente;
            versao = o_tb_nf_versao.desc_versao.ToString();

            if (o_tb_nf_parametro.sit_usa_proxy)
            {
                proxy = o_tb_nf_parametro.url_proxy.ToString();
                usuario = o_tb_nf_parametro.usuario_proxy.ToString();
                senha = o_tb_nf_parametro.senha_proxy.ToString();
            }
            
            licenca = o_tb_nf_parametro.licenca.ToString();
            NomeCertificado = o_tb_nf_parametro.nome_certificado.ToString();
            SenhaCertificado = o_tb_nf_parametro.senha_certificado.ToString();
            cert = Certificado(o_tb_nf_parametro);
            siglaWS = SiglaWS(o_tb_nf_parametro);
            

            return util.BuscaNFe2G(siglaWS, tipoAmbiente, ref NFeAssinada, nroRecibo, cert, versao, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroProtocolo, out dhProtocolo, out cMsg, out xMsg, proxy, usuario, senha, licenca);

        }


        public string SiglaWS(OBJ_TB_NF_PARAMETRO obj)
        {


            OBJ_TB_UF o_tb_uf = new OBJ_TB_UF();
            BLL_TB_UF b_tb_uf = new BLL_TB_UF();

            o_tb_uf = b_tb_uf.SelecionarObjetoPorId(obj.id_uf);
            string siglaWS = string.Empty;

            if (obj.id_tipo_emissao == (int)PUB_ENUM.NF_TIPO_EMISSAO.NORMAL)
            {
                // a sigla SVAN, caso a UF seja usuária da SEFAZ Virtual do Ambiente Nacional (ES, MA, PA, PI e RN);
                if (o_tb_uf.uf == "ES" || o_tb_uf.uf == "MA" || o_tb_uf.uf == "PA" || o_tb_uf.uf == "PI" || o_tb_uf.uf == "RN")
                {

                    siglaWS = "SVAN";
                }
                // a sigla SVRS, caso a UF seja usuária da SEFAZ Virtual do Rio Grande do Sul (AC, AL, AP, DF, PB, RJ, RO, RR, SC, SE e TO);
                if (o_tb_uf.uf == "AC" || o_tb_uf.uf == "AL" || o_tb_uf.uf == "AP" || o_tb_uf.uf == "DF" || o_tb_uf.uf == "PB" || o_tb_uf.uf == "RJ" || o_tb_uf.uf == "RO" || o_tb_uf.uf == "RR" || o_tb_uf.uf == "SC" || o_tb_uf.uf == "SE" || o_tb_uf.uf == "TO")
                {
                    siglaWS = "SVRS";
                }
                // a sigla da UF, caso a UF tenha aplicação própria (AM, BA, CE, GO, MS, MT, MG, PE, PR, RS e SP);
                if (o_tb_uf.uf == "AM" || o_tb_uf.uf == "BA" || o_tb_uf.uf == "CE" || o_tb_uf.uf == "GO" || o_tb_uf.uf == "MS" || o_tb_uf.uf == "MT" || o_tb_uf.uf == "MG" || o_tb_uf.uf == "PE" || o_tb_uf.uf == "PR" || o_tb_uf.uf == "RS" || o_tb_uf.uf == "SP")
                {
                    siglaWS = o_tb_uf.uf;
                }

            }
            // a sigla SCAN, na emissão em contingência SCAN - Sistema de Contingência do Ambiente Nacional.
            if (obj.id_tipo_emissao == (int)PUB_ENUM.NF_TIPO_EMISSAO.CONTINGENCIA_SCAN)
            {
                siglaWS = "SCAN";
            }

            return siglaWS;
        }




        public string EnviaNFe2G(OBJ_TB_NF obj, string nfe_XML, out string msgDados, out string msgRetWS, out int cStat, out string  msgResultado, out string nroRecibo, out string dhRecbto, out string tMed)
        {
            NFe_Util_2G.Util util = new Util();
      
            BLL_TB_NF b_tb_nf = new BLL_TB_NF();
            OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();

            OBJ_TB_NF_VERSAO o_tb_nf_versao = new OBJ_TB_NF_VERSAO();
            BLL_TB_NF_VERSAO b_tb_nf_versao = new BLL_TB_NF_VERSAO();

            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            OBJ_TB_ENDERECO_EMPRESA o_tb_endereco_empresa = new OBJ_TB_ENDERECO_EMPRESA();
            BLL_TB_ENDERECO_EMPRESA b_tb_endereco_empresa = new BLL_TB_ENDERECO_EMPRESA();

            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();
            
            string path = string.Empty;
            string cert = string.Empty;                  
            string siglaWS  = string.Empty;        
            string proxy = string.Empty;
            string usuario = string.Empty;
            string senha = string.Empty;
            string licenca = string.Empty;
            string versao = string.Empty;            

           
            
            o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

            o_tb_nf_versao = b_tb_nf_versao.SelecionarObjetoPorId(obj.id_versao);

            if (o_tb_nf_parametro.sit_usa_proxy)
            {
                
                proxy = o_tb_nf_parametro.url_proxy.ToString();
                usuario = o_tb_nf_parametro.usuario_proxy.ToString();
                senha = o_tb_nf_parametro.senha_proxy.ToString();
            }

            licenca = o_tb_nf_parametro.licenca.ToString();
            cert = Certificado(o_tb_nf_parametro);
            versao = o_tb_nf_versao.desc_versao.ToString();


            return util.EnviaNFe2G(SiglaWS(o_tb_nf_parametro), ref nfe_XML, cert, versao, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroRecibo, out dhRecbto, out tMed, proxy, usuario, senha, licenca);

        }

        public string Certificado(OBJ_TB_NF_PARAMETRO obj)
        {             
            string NomeCertificado = obj.nome_certificado.ToString();
            string SenhaCertificado = obj.senha_certificado.ToString();
            string Path = HttpContext.Current.Server.MapPath(obj.diretorio_certificado.ToString());
            string Cert = string.Empty;

            Cert = string.Concat("ARQUIVO", "|", Path, "\\", NomeCertificado, "|", SenhaCertificado);

            return Cert;
        }
        

        public string GerarXML(OBJ_TB_NF obj, string chaveNFe)
        {

            try
            {
                string sProduto = string.Empty;
                string sImpostoIPI = string.Empty;
                string sImpostoICMS = string.Empty;
                string sImpostoCOFINS = string.Empty;
                string sImpostoCOFINSST = string.Empty;
                string sImpostoPIS = string.Empty;
                string sImpostoPISST = string.Empty;
                string sImpostoII = string.Empty;
                string sImpostoISSQN = string.Empty;
                StringBuilder sImposto = new StringBuilder();
                StringBuilder sDetalhe = new StringBuilder();

                BLL_TB_NF_ITEM b_tb_nf_item = new BLL_TB_NF_ITEM();
       

                int cont = 0;
                foreach (OBJ_TB_NF_ITEM o_tb_nf_item in b_tb_nf_item.SelecionarLista(string.Format("tb_nf_item.id_nf = {0}", obj.id), ""))
                {
                    cont = cont + 1;


                    sProduto = Produto(o_tb_nf_item);
                    sImpostoICMS = ICMS2G(o_tb_nf_item);
                    sImpostoIPI = IPI(o_tb_nf_item);
                    sImpostoII = II(o_tb_nf_item);
                    sImpostoPIS = PIS(o_tb_nf_item);
                    sImpostoPISST = PISST(o_tb_nf_item);
                    sImpostoCOFINS = COFINS(o_tb_nf_item);
                    sImpostoCOFINSST = COFINSST(o_tb_nf_item);
                    sImpostoISSQN = ISSQN(o_tb_nf_item);

                    sDetalhe.Append(Detalhe(cont, sProduto, imposto2G(sImpostoICMS, sImpostoIPI, sImpostoII, sImpostoPIS, sImpostoPISST, sImpostoCOFINS, sImpostoCOFINSST, sImpostoISSQN), string.Empty));

                }               

                // versao
                nfe_versao = Versao();

                // chave
                nfe_Id = chaveNFe;

                // identificacao
                nfe_ide = Identificador(obj);

                // emitente
                nfe_emit = Emitente2G(obj);

                // destinatario
                nfe_dest = Destinatario2G(obj);

                nfe_avulsa = string.Empty;

                // retirada
                nfe_retirada = LocalRetirada2G(obj);

                // entrega
                nfe_entrega = LocalEntrega2G(obj);


                nfe_procRef = procRef(obj);

                // detalhe
                nfe_detalhes = sDetalhe.ToString();

                // transporta 
                nfe_transporta = Transporta(obj);

                // volume
                nfe_vol = VolumeTransporte(obj);

                // reboque
                nfe_reboque = ReboqueTransporte(obj);

                // trib ret transp
                nfe_retTransp = RetTransporte(obj);

                // transportadora
                nfe_transp = Transportador2G(obj.id_tipo_frete.ToString(), nfe_transporta, nfe_veicTransp, nfe_veicTransp, nfe_reboque, nfe_vagao, nfe_balsa, nfe_vol);

                // total nota fiscal
                nfe_total = Total(TotalIcms(obj), TotalISSQN(obj), TributoRetido(obj));

                // obs contribuinte
                nfe_obsCont = obsCont(obj);

                // obs fisco
                nfe_obsFisco = obsFisco(obj);

                // info adicional
                nfe_inf = infAdic2G(string.Empty, string.Empty, nfe_obsCont, nfe_obsFisco, nfe_procRef);

                // cobranca
                nfe_cobr = Cobranca(obj);

                nfe_XML = NFe2G(nfe_versao, nfe_Id, nfe_ide, nfe_emit, nfe_avulsa, nfe_dest, nfe_retirada, nfe_entrega, nfe_detalhes, nfe_total, nfe_transp, nfe_cobr, nfe_inf, nfe_exporta, nfe_compra, nfe_cana);

                return nfe_XML;
            }
            catch (Exception)
            {
                
                throw;
            }

            

            
        }
        

        public string PathAbsoluto(OBJ_TB_NF obj, PUB_ENUM.NF_STATUS status)
        {
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();

            o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);
            o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);
            String path = string.Empty;

            switch (status)
            {

                case PUB_ENUM.NF_STATUS.EMDIGITACAO:
                    path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_temporario);
                    break;

                case PUB_ENUM.NF_STATUS.ASSINADA:
                     path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_assinada);
                break;

                case PUB_ENUM.NF_STATUS.AUTORIZADA:

                        if(Equals(obj.id_operacao,(int)PUB_ENUM.NF_OPERACAO.ENTRADA))
                        {
                            path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_entrada);
                        }
                        else
                        {
                            path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_saida);
                        }
                        

                break;

                case PUB_ENUM.NF_STATUS.CANCELADA:

                    path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_assinada);

                    break;

                case PUB_ENUM.NF_STATUS.DENEGADA:

                    path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_denegada);
                    break;

                case PUB_ENUM.NF_STATUS.VALIDADA:

                    path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_validada);
                    break;

                case PUB_ENUM.NF_STATUS.REJEITADA:

                    path = HttpContext.Current.Server.MapPath(o_tb_nf_parametro.diretorio_rejeitada);
                    break;                    

            }

            // recebe o parametro do diretorio de saida

            String ano = DateTime.Now.Year.ToString();
            String mes = DateTime.Now.Month.ToString();            

            path = string.Concat(path, "\\", o_tb_empresa.cnpj, "\\", ano, "\\", mes);

            return path;
        }


        public string PathRelativo(OBJ_TB_NF obj, PUB_ENUM.NF_STATUS status)
        {
            OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();
            BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();

            OBJ_TB_EMPRESA o_tb_empresa = new OBJ_TB_EMPRESA();
            BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();

            o_tb_empresa = b_tb_empresa.SelecionarObjetoPorId(obj.id_empresa);
            o_tb_nf_parametro = b_tb_nf_parametro.SelecionarObjetoPorIdEmpresa(obj.id_empresa);

            String path = string.Empty;

            switch (status)
            {

                case PUB_ENUM.NF_STATUS.EMDIGITACAO:
                    path = o_tb_nf_parametro.diretorio_temporario;
                    break;

                case PUB_ENUM.NF_STATUS.ASSINADA:
                    path = o_tb_nf_parametro.diretorio_assinada;
                    break;

                case PUB_ENUM.NF_STATUS.AUTORIZADA:

                    if (Equals(obj.id_operacao, (int)PUB_ENUM.NF_OPERACAO.ENTRADA))
                    {
                        path =  o_tb_nf_parametro.diretorio_entrada;
                    }
                    else
                    {
                        path = o_tb_nf_parametro.diretorio_saida;
                    }
                    break;

                case PUB_ENUM.NF_STATUS.CANCELADA:

                    path =  o_tb_nf_parametro.diretorio_assinada;

                    break;

                case PUB_ENUM.NF_STATUS.DENEGADA:

                    path =  o_tb_nf_parametro.diretorio_denegada;
                    break;

                case PUB_ENUM.NF_STATUS.VALIDADA:

                    path = o_tb_nf_parametro.diretorio_validada;
                    break;

                case PUB_ENUM.NF_STATUS.REJEITADA:

                    path =  o_tb_nf_parametro.diretorio_rejeitada;
                    break;

                case PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ:

                    path = o_tb_nf_parametro.diretorio_processando;
                    break;

            }

            // recebe o parametro do diretorio de saida

            String ano = DateTime.Now.Year.ToString();
            String mes = DateTime.Now.Month.ToString();

            path = string.Concat(path, "/", o_tb_empresa.cnpj, "/", ano, "/", mes);

            return path;
        }

    }
}
